1 메타분석 개요(Introduction to Meta Analysis)

메타분석은 동일한 연구 주제로 수행된 다양한 연구로부터 도출된 결과를 계량적으로 분석하는 통합적인 접근 방법(research synthesis)을 의미한다. 일반적으로 동일한 연구 주제로 수행된 연구라할지라도 연구 결과는 연구마다 조금씩 다르기 때문에 어떤 치료(treatment)나 중재(intervention)에 대한 의사결정을 할 때 특정 연구(a single study)의 결과에만 의존하면 잘못된 결정을 내릴 위험이 크다. 따라서, 기존에 제시된 연구 결과를 종합적으로 분석할 수 있는 매커니즘이 필요하며, 이를 위해 메타분석법이 개발되었다.

메타분석의 간단한 역사는 다음과 같다.

1952년 Hans Eysenck는 정신요법(psychotherapy)이 별다른 효과를 보이지 않는 것으로 결론지어 이에대한 격렬한 논의가 시작되었으며, 이 후 20년간 수백 건의 연구가 진행되었으나 논쟁을 종결시키는 것에는 실패하였다. 이에 1976년 Gene Glass와 그의 동료 Smith는 Eysench의 결론이 잘못되었다는 것을 증명하기 위해 정신요법을 주제로 한 연구 375편을 통계적인 방법으로 통합을 시도하여 정신요법이 효과가 있는 것으로 결론을 내었으며, 이때 사용한 방법을 메타분석(Meta-analysis)라고 명명하였다.

전통적으로 통계적인 방법은 통계적 유의성 검정에 중점을 두지만, 이러한 방법은 여러 결과를 통합하는데 적절하지 않기 때문에 메타분석은 통계적 유의성보다 방향(direction)과 효과의 크기(magnitude of effects)에 중점을 두고 있다. 메타분석의 기본적인 수행 원리는 다음과 같다.

다음의 경우를 생각해보자. 예를 들어 BCG 백신의 효과를 밝히거나, 물리적 거리 또는 마스크가 COVID-19에 효과적인지, 만약 효과가 있다면 어느 정도의 효과를 가지는지 알아보고자 한다면 이와 관련한 연구들을 수집하여 메타분석을 통해 통합적으로 정량적 합성을 할 수 있다. 다음은 스트렙토키나아제(Streptokinase) 메타분석 예제이다. 1959년부터 1988년까지(약 30년간) 심장마비 후 사망을 예방하는 streptokinase의 능력을 평가하기 위해 총 33건의 무작위 시험이 시행되었으며(Introduction to Meta-Analysis, Borenstein et al., 2009), 이를 통합한 메타분석 결과는 다음과 같다.

위의 메타분석에 사용된 개별 연구 결과는 모두 유사한 프로토콜에 기반한 임상시험으로부터 도출되었다. 환자군은 무작위로 치료군 또는 위약군에 배정되었으며 동일한 결과 변수를 보고하였다. 결과를 살펴보면 33개의 연구 중 6개의 연구는 통계적으로 유의하고 나머지 27개의 연구는 유의하지 않은 결과를 보이고 있음을 알 수 있다. 즉, 연구 결과가 다양하여 이로 인해 streptokinase의 능력에 대해 명확한 결론을 내리기가 쉽지 않다. 이러한 경우 메타분석을 통해 통합적인 결론을 이끌어 낼 수 있다.

메타분석의 목적은 어떤 치료나 중재에 대한 의사결정을 하기 위해 특정 연구보다는 전체적인 연구 결과의 통합적 분석에 있다. 통합적 분석 방법으로는 체계적 문헌고찰(systematic reviews)과 메타분석(meta-analysis)이 존재한다. 체계적 문헌고찰은 정성/정량적인 분석방법을 기본으로, 때로는 정량적인 부분을 포함하지 않는 경우도 있다. 반면 메타분석은 계량적/정량적인 접근 방법에 주안을 두고 있으며, 때로는 비체계적인 문헌고찰을 수행한 후 메타분석을 하는 경우도 있다. 따라서 일반적으로 체계적 문헌고찰과 메타분석을 동일 또는 하위 개념으로 보기는 쉽지 않다.

과학적인 근거를 도출하는 방법은 사례보고, 질적연구, 상관관계연구, 실험조사설계 등 매우 다양하지만, 효과 검증을 위한 과학적인 근거에 대한 전통적 위계구조(hierarchy of evidence, level of evidence)에서는 체계적 문헌고찰과 메타분석이 중재 효과를 평가하는 과학적 근거로서 가장 상위에 위치하고 있다. 하지만 최근에는 전통적 위계구조의 최 상단에 위치한 체계적리뷰/메타분석을 따로 분리해서 보거나 혹은 하위에 존재하는 임상 시험 및 코호트 연구를 좀 더 세밀히 살피는 돋보기 역할로 봐야 한다는 주장이 대두되고 있다(Hassan Murad et al., 2016).

기존의 연구로부터 도출된 결과들을 통계적인 방법을 통해 체계적으로 분석하는 메타분석의 장점은 다음과 같다.

  • 연구 결과를 ’합계(summing-up)’하는 과정에 규율을 부과
  • 전통적인 문헌고찰과는 차별화되고 좀 더 정교한 방식으로 결과를 보여줌
  • 연구 간 차이를 과도하게 해석하지 않도록 보호
  • 모수를 더 정확하게 추정
  • 결과에 영향을 줄 만한 요인에 대한 분석
  • 오류와 왜곡의 최소화

반면, 메타분석의 단점은 다음과 같다.

  • 통합가능한 연구 선택 등 많은 노력이 필요
  • 기계적인 방법으로 연구간 정성적(qualitative) 차이를 포착하는데 적절하지 않음
  • Apple and Orange 문제
  • 대부분의 메타분석은 어느정도 흠집이 있는(blemished) 연구가 포함됨
  • 지속적인 선택 비뚤림(selection bias) 문제 내포
    • 음성이거나 효과없는 연구는 찾기 어려움
    • 부정적이거나 유의적이지 않은 결과는 보고되지 않음


1.1 메타분석 과정

메타분석은 일반적인 조사연구의 단계인 1) 연구주제 선정, 2) 문헌의 검색, 3) 데이터 수집, 4) 데이터 분석, 5) 결과보고서 작성의 순서와 비슷하게 진행되며, 구체적인 단계는 다음과 같다.


1.1.1 연구주제 선정 및 연구질문

메타분석의 첫 단계는 다른 조사연구와 마찬가지로 연구 질문을 구체적으로 제기하는 것이다. 연구 질문을 어떻게 제기하느냐에 따라 다음 사항들이 결정된다.

  • 분석에 포함될 연구(studies to be included)
  • 효과크기의 유형(type of effect size analyzed)
  • 연구의 특성(study characteristics coded)
  • 분석 방법(methods of analysis)

연구 질문이 결정되고 나면 다음 단계는 연구에 포함될 관련 문헌들을 검색하고 이를 찾아내는 것이다. 하지만 문헌 검색에 앞서 연구의 선정 기준(eligibility criteria)을 명확히 해야하며, 연구의 선정기준은 일반적으로 연구대상자(population or participants), 중재방법(intervention), 비교집단(comparison), 연구 결과(outcomes), 연구유형(study designs)을 의미하는 PICOS로 정리할 수 있다.


1.1.2 문헌 검색

PICOS에 따라 연구 선정 기준이 정해지고 나면 관련 문헌, 즉 연구 결과들을 검색하게되며 검색 방법은 관련 학술 데이터베이스(예: Embase, PubMed 등)를 기본으로 하며, 이에 더해 관련 저널에 대한 수작업 검색(hand search), 회색문헌(grey literature)에 대한 검색, 적합도가 높은 연구논문의 참고문헌 검색, 연구자들을 직접 접촉하는 방법 등을 활용하게 된다. 문헌 검색은 체계적 문헌고찰과 함께 메타분석에 있어서 가장 중요한 부분 중 하나로, 충분히 포괄적이고 체계적이어야 한다. 문헌 검색은 다음과 같은 단계로 진행되는 것이 일반적이다.


1.1.3 연구 선정, 개별연구의 질 검증 및 코딩

2단계에서 검색된 문헌을 토대로 적절한 데이터를 추출해서 분석을 위한 코딩 작업을 하는 단계가 세 번째 단계이다. 최종 연구의 선정 과정은 일반적으로 다음과 같다.

  1. 문헌 발견: 데이터베이스 검색 등을 통해 발견한 연구
  2. 문헌 선별: 중복 연구 제외, 제외한 연구와 그 이유 등
  3. 선정기준 검토: 전문(full-text) 검토 등을 통한 연구 선정
  4. 최종 선정

이어서 최종 연구에 선정된 연구들을 대상으로 그 연구의 질을 확인하며, 다음은 메타분석에 포함된 각 개별연구를 코크란(Cochrane)의 Risk of Bias (ROB) 분석 도구를 통해 연구의 질을 분석한 사례이다.

다음 단계는 각 개별연구에서 데이터를 추출하여 코딩을 하며, 이 작업은 데이터 분석 및 통합을 위한 준비단계에 해당된다. 일반적으로 데이터 코딩에는 연구이름, 출간연도, 출간유형, 표본의 특성, 개입의 특성(개입기간, 횟수 등), 연구유형, 집단배정 방법, 측정도구, 효과크기 등에 대한 내용을 코딩한다.


1.1.4 데이터 분석

데이터 분석 단계에서는 각 연구의 효과크기를 우선적으로 계산한 후 그 통계적 유의성을 살펴보고, 평균효과크기와 통계적 유의성을 보게 된다. 그리고 각 효과크기를 잘 표현해주는 forest plot을 기본적으로 제시한다.


1.1.5 결과 보고

메타분석 결과에 대한 보고는 일반적으로 여타 연구 결과 보고와 비슷하다. 연구 결과는 다음과 같이 구성된다.

  • 서론(introduction)
  • 연구방법(method)
  • 분석결과(results)
  • 논의(discussion)
  • 참고문헌(references)
  • 부록(appendices)


1.2 메타분석 주요 용어

1.2.1 효과크기

효과크기(effect size)는 프로그램(개입)의 효과크기, 또는 변수 간 관계의 크기를 표현한 값을 의미한다. 메타분석에서 분석 단위(unit of currency in a meta analysis)에 해당되며, 일반적으로 효과크기의 유형으로는 표준화된 평균 차이(Cohen’s d, Hedges’g), 두 집단의 비율(risk ratio, odds ratio, risk difference), 두 변수 간의 상관계수(correlation coefficients) 등이 있다. 메타분석은 일반적으로 다음과 같은 순서로 진행된다.

  1. 개별연구의 효과크기 계산
  2. 개별연구 간 효과크기의 일관성 검토
  3. 평균효과크기 산출 및 유의성 검토


1.2.2 통계적 유의성

각 연구의 효과크기는 신뢰구간(confidence interval)으로 경계를 표현하며, 각 연구에서 추정된 효과크기의 통계적 유의성(statistical significance)을 나타낸다. 예를 들어, 효과크기가 군간 차이를 나타낸다면 신뢰구간이 0을 포함하지 않을 때 통계적으로 유의하다. 또한, 신뢰구간은 효과크기의 정밀성(precision)을 나타내기도 하는데, 구간의 길이가 짧을수록 추정된 효과크기가 정밀하다고 볼 수 있다.


1.2.3 가중값

메타분석에서는 개별연구별로 서로 다른 가중값(weight)을 부여하며, 평균효과크기(summary effect size)를 계산할 때 사용한다. 일반적으로 가중값이 큰 연구들은 정밀성(precision)이 높은 연구이며, 가중값이 작은 연구들은 정밀성이 낮은 연구이다. 가중값은 분산의 역수(inverse of the variance)로 계산되며, 표본크기가 클수록(분산이 작을수록) 높은 가중값이 부여된다.

\[ W_i=\frac{1}{V_i}, \,\,\, W: 가중값,\,\,\, V: 분산 \]

1.2.4 평균효과크기

메타분석의 주요 내용 중 한 가지는 평균효과크기 계산이다. 각 개별연구의 효과크기에 가중값을 부여해서 전체 연구의 효과크기, 즉 평균 효과크기를 산출한다. 또한 평균효과크기의 유의성을 판단함으로써 평균효과크기의 의미를 설명할 수 있다. 일반적으로 평균효과크기(mean effect size, summary effect size)는 전체효과크기(overall effect size), 효과의 가중평균(weighted mean effect) 등으로 불린다.

1.2.5 Forest plot

메타분석을 이해하려면 가장 기본적인 분석 결과인 forest plot을 먼저 이해해야 한다. Forest plot에는 각 개별연구의 효과크기, 통계적 유의성(정밀성), 가중값이 제시된다. 아울러 개별연구들을 종합한 평균 효과크기와 그 통계적 유의성도 제시된다.

Forest plot에서 정사각형(square)은 개별연구의 효과크기를 나타내고, 구체적으로 정사각형의 크기는 가중값, 정사각형의 위치는 효과크기의 방향(+ 또는 -)을 나타낸다. 정사각형의 가운데 위치는 크기(magnitude of the effect)를 표현한다. 다이아몬드(diamond)는 전체효과크기, 즉 평균효과크기(mean effect size 또는 summary effect size)를 나타낸다.


1.3 일반적인 메타분석 접근법

  1. 자료종류에 따른 요약 통계량 선정 및 유형 검토
  • 연속형 자료, 이분형 자료, 생존 자료 등


  1. 요약 통계량 결합을 위한 메타분석의 통계적 모형 선정
  • 고정효과모형(fixed effect model), 랜덤효과모형(random effect model)

  • 빈도주의모형(freqentest model), 베이지안모형(Bayesian model)


  1. 이질성 검토 및 메타분석: 시각적 검토 및 통계적 검정
  • 이질성(heterogeneity) 문제가 없을 때 메타분석 시행

  • 이질성이 확인될 경우 원인 파악

    • Subgroup analysis, meta-regression
  • 이질성 원인을 설명하지 못한 경우 질적으로 기술(qualitative analysis)


  1. 출판 비뚤림(publication bias) 및 민감도 분석(sensitivity analysis)
  • 연구특성에 따른 분석이나 이상값을 포함 또는 배제시킨 후 분석 등

2 효과크기 계산

2.1 연속형 자료의 효과크기 계산


2.1.1 평균차(mean difference; MD)

일반적으로 두 집단 간 비교연구에서 보고되는 주요 통계량은 다음과 같다.

  1. 평균, 표준편차, 표본크기(mean, SD, sample size)
  2. 검정통계량( \(t\)-value, \(F\)-value 등)
  3. 유의확률 (예:\(p=0.013\) 등)
  4. 구간화 유의확률 (예: \(p<0.05\) 등)

보통 연구 결과에는 두 집단의 평균, 표준편차, 표본크기가 제시되며, 메타분석에서 가장 일반적으로 선호되는 형태이다.


표준화되지 않은 평균차(raw mean difference)는 의미있는 결과 측정(예: 혈압)과 모든 연구에서 동일한 척도(measure)를 사용한 경우 적용가능하다. 모집단에서 평균차이 \(\Delta\)는 다음과 같이 정의된다.

\[ \Delta = \mu_1 - \mu_2 \] 이때, 모집단의 평균차 \(\Delta\)는 독립적인 두 집단(treatment and control)의 표본평균 \(\bar{X}_1\)\(\bar{X}_2\)로부터 추정되고 다음과 같이 \(D\)로 정의할 수 있다.

\[ D = \bar{X}_1 - \bar{X}_2 \] 만약, 두 모집단의 분산이 동일하다고 가정하면, \(\sigma_1 = \sigma_2 = \sigma\), \(i\)번째 연구에서의 평균차 \(D_1\)의 분산은 다음과 같다.

\[ Var(D_i )=\frac{n_1 + n_2}{n_1 n_2}S_p^2 \] 여기서 \(n_1\)은 첫번째 집단의 표본크기, \(n_2\)는 두번째 집단의 표본크기, 합동분산추정량(pooled variance estimator) \(S_p^2\)\[ S_p^2 = \frac{(n_1-1)S_1^2 + (n_2-1)S_2^2}{n_1 +n_2 -2} \] 이고, \(S_1^2\)\(S_2^2\)은 각 집단의 표본분산을 의미한다.

만약, 두 모집단의 분산이 다르다고 가정하면, \(\sigma_1 \ne \sigma_2\), \(i\)번째 연구에서의 평균차 \(S_i\)의 분산은 다음과 같다. \[ Var(D_i) = \frac{S_1^2}{n_1}+\frac{S_2^2}{n_2} \]

두 경우 모두 표준오차(standard error) \(S_p\)는 다음과 같다. \[ SE(D_i ) = \sqrt{Var(D_i)} \] \(i\)번째 연구에서 효과크기의 신뢰구간은 다음과 같다. \[ CI = D_i \pm z_{\alpha/2} \times SE(D_i ) \] \(i\)번째 연구의 가중값은 분산의 역수(inverse variance)로 정의하고 다음과 같다. \[ w_i = \frac{1}{Var(D_i)} \]

평균효과크기 \(M\)은 가중값을 이용한 가중평균으로 나타내며, 그 정의는 다음과 같다. \[ M = \frac{\sum_{i=1}^K w_iD_i}{\sum_{i=1}^K w_i} \] 평균효과크기 \(M\)의 분산과 표준오차는 다음과 같다. \[ Var(M)=\frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{Var(M)} \]

따라서 평균효과크기의 신뢰구간은 다음과 같다. \[ CI=M\pm z_{\alpha/2}\times SE(M) \]


2.1.2 Example

  • Multifocal versus monofocal intraocular lenses for age-related cataract patients: a system review and meta-analysis based on randomized controlled trials (Cao et al., 2019)


2.1.2.1 데이터 입력

두 집단간 비교연구에서 필요한 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 값이다. 여기서는 10개의 개별 연구의 값을 입력한다.

cdata <- read.table(text='
study n1 m1 s1 n2 m2 s2
Leyand(2002)    29  0.06    0.1 16  0.03    0.12
NijKamp(2004)   68  0.13    0.2 69  0.16    0.2
Harman(2008)    24  0.07    0.13    19  0.08    0.1
Martinez(2008)  88  0.16    0.11    24  0.13    0.09
Ye(2010)    50  0.09    0.07    50  0.06    0.08
Peng(2012)  50  0.03    0.14    51  0.08    0.15
Rasp(2012)  111 0.62    0.32    29  0.62    0.38
Wilkins(2013)   94  0.08    0.12    93  0.06    0.16
Puell(2015) 21  0.13    0.08    18  0.08    0.12
', header=T)

cdata
##            study  n1   m1   s1 n2   m2   s2
## 1   Leyand(2002)  29 0.06 0.10 16 0.03 0.12
## 2  NijKamp(2004)  68 0.13 0.20 69 0.16 0.20
## 3   Harman(2008)  24 0.07 0.13 19 0.08 0.10
## 4 Martinez(2008)  88 0.16 0.11 24 0.13 0.09
## 5       Ye(2010)  50 0.09 0.07 50 0.06 0.08
## 6     Peng(2012)  50 0.03 0.14 51 0.08 0.15
## 7     Rasp(2012) 111 0.62 0.32 29 0.62 0.38
## 8  Wilkins(2013)  94 0.08 0.12 93 0.06 0.16
## 9    Puell(2015)  21 0.13 0.08 18 0.08 0.12


2.1.2.2 Mean difference

attach(cdata)

# 효과크기: 평균차
D <- m1 - m2

cbind(cdata,D)
##            study  n1   m1   s1 n2   m2   s2     D
## 1   Leyand(2002)  29 0.06 0.10 16 0.03 0.12  0.03
## 2  NijKamp(2004)  68 0.13 0.20 69 0.16 0.20 -0.03
## 3   Harman(2008)  24 0.07 0.13 19 0.08 0.10 -0.01
## 4 Martinez(2008)  88 0.16 0.11 24 0.13 0.09  0.03
## 5       Ye(2010)  50 0.09 0.07 50 0.06 0.08  0.03
## 6     Peng(2012)  50 0.03 0.14 51 0.08 0.15 -0.05
## 7     Rasp(2012) 111 0.62 0.32 29 0.62 0.38  0.00
## 8  Wilkins(2013)  94 0.08 0.12 93 0.06 0.16  0.02
## 9    Puell(2015)  21 0.13 0.08 18 0.08 0.12  0.05


2.1.2.3 D의 분산과 표준오차

### 합동분산추정량
sp2 <- ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2)

### D의 분산 (등분산)
varD <- (n1+n2)/(n1*n2)*sp2

### D의 분산 (이분산)
varD <- s1^2/n1 + s2^2/n2

### D의 표준오차
seD <- sqrt(varD)

cbind(cdata,D,varD)
##            study  n1   m1   s1 n2   m2   s2     D         varD
## 1   Leyand(2002)  29 0.06 0.10 16 0.03 0.12  0.03 0.0012448276
## 2  NijKamp(2004)  68 0.13 0.20 69 0.16 0.20 -0.03 0.0011679454
## 3   Harman(2008)  24 0.07 0.13 19 0.08 0.10 -0.01 0.0012304825
## 4 Martinez(2008)  88 0.16 0.11 24 0.13 0.09  0.03 0.0004750000
## 5       Ye(2010)  50 0.09 0.07 50 0.06 0.08  0.03 0.0002260000
## 6     Peng(2012)  50 0.03 0.14 51 0.08 0.15 -0.05 0.0008331765
## 7     Rasp(2012) 111 0.62 0.32 29 0.62 0.38  0.00 0.0059018329
## 8  Wilkins(2013)  94 0.08 0.12 93 0.06 0.16  0.02 0.0004284603
## 9    Puell(2015)  21 0.13 0.08 18 0.08 0.12  0.05 0.0011047619


2.1.2.4 신뢰구간

### 신뢰 하한 
lb <- D - qnorm(0.975)*seD

### 신뢰 상한 
ub <- D + qnorm(0.975)*seD

data.frame(study=cdata[,1],D,varD,lb,ub)
##            study     D         varD            lb          ub
## 1   Leyand(2002)  0.03 0.0012448276 -0.0391516732 0.099151673
## 2  NijKamp(2004) -0.03 0.0011679454 -0.0969821940 0.036982194
## 3   Harman(2008) -0.01 0.0012304825 -0.0787520740 0.058752074
## 4 Martinez(2008)  0.03 0.0004750000 -0.0127164247 0.072716425
## 5       Ye(2010)  0.03 0.0002260000  0.0005352805 0.059464719
## 6     Peng(2012) -0.05 0.0008331765 -0.1065739613 0.006573961
## 7     Rasp(2012)  0.00 0.0059018329 -0.1505710727 0.150571073
## 8  Wilkins(2013)  0.02 0.0004284603 -0.0205698487 0.060569849
## 9    Puell(2015)  0.05 0.0011047619 -0.0151452022 0.115145202


2.1.2.5 가중값

### 가중값
W <- 1/varD

### 가중값 표준화
Wp <- W/sum(W)*100

data.frame(study=cdata[,1],D,varD,lb,ub,Wp)
##            study     D         varD            lb          ub        Wp
## 1   Leyand(2002)  0.03 0.0012448276 -0.0391516732 0.099151673  5.902006
## 2  NijKamp(2004) -0.03 0.0011679454 -0.0969821940 0.036982194  6.290516
## 3   Harman(2008) -0.01 0.0012304825 -0.0787520740 0.058752074  5.970812
## 4 Martinez(2008)  0.03 0.0004750000 -0.0127164247 0.072716425 15.467325
## 5       Ye(2010)  0.03 0.0002260000  0.0005352805 0.059464719 32.508759
## 6     Peng(2012) -0.05 0.0008331765 -0.1065739613 0.006573961  8.818035
## 7     Rasp(2012)  0.00 0.0059018329 -0.1505710727 0.150571073  1.244864
## 8  Wilkins(2013)  0.02 0.0004284603 -0.0205698487 0.060569849 17.147398
## 9    Puell(2015)  0.05 0.0011047619 -0.0151452022 0.115145202  6.650283


2.1.2.6 평균효과크기와 분산, 신뢰구간

### 평균효과크기
M <- sum(W*D)/sum(W)

### 평균효과크기의 분산
varM <- 1/sum(W)

### 평균효과크기의 표준오차
seM <- sqrt(varM)

### 평균효과크기의 신뢰구간
lb <- M - qnorm(0.975)*seM
ub <- M + qnorm(0.975)*seM

data.frame(M, varM, seM, lb, ub)
##            M        varM         seM            lb         ub
## 1 0.01602479 7.34698e-05 0.008571452 -0.0007749432 0.03282453
detach(cdata)


2.1.3 표준화 평균차

표준화 평균차(standardized mean difference; SMD)는 Cohen’s \(d\)로 불리며, \(i\)번째 연구에서의 표준화 평균차 \(d_i\)는 다음과 같이 정의한다.

\[ d_i = \frac{\bar{X_1}-\bar{X_2}}{S_p} \]

여기서 \(S_p\)는 합동표준편차 추정량(pooled standard deviation estimator)을 의미하며, \(S_p\)는 다음과 같다.

\[ S_p = \sqrt{\frac{(n_1 -1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2}} \]

여기서 \(S_1^2\)\(S_2^2\)은 각 집단의 표본분산을 의미한다.

만약 \(t\) 또는 \(F\)값이 제시된 경우 \(d_i\)의 정의는 다음과 같다.

  • 검정통계량 \(t\) 값이 주어진 경우:

\[ d_i = t_i\sqrt{\frac{n_1+n_2}{n_1n_2}} \]

  • 검정통계량 \(F\) 값이 주어진 경우:

\[ d_i = \sqrt{\frac{F_i (n_1+n_2)}{n_1n_2}} \]

개별 연구의 표준화 평균차 \(d_i\)의 분산은 다음과 같이 정의한다.

\[ Var(d_i)=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)}=\frac{n_1+n_2}{n_1n_2}+\frac{d_i^2}{2(n_1+n_2)} \]

2.1.3.1 보정된(adjusted) 표준화 평균차

Cohen’s d는 표본크기가 작은 경우(\(n \le 20\)) 효과크기를 과대 추정하는 경향이 있다. 이를 보정(adjust)하기 위해 Hedges’g는 다음과 같이 정의한다.

\[ g_i = J \times d, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \] Hedges’ g의 분산은 다음과 같다.

\[ Var(g_i)=J^2\times Var(d_i) \]


2.1.3.2 효과크기의 표준오차와 신뢰구간

각 연구의 효과크기와 신뢰구간은 다음과 같다.

  • Cohen’s d의 경우: \[ CI(d_i)=d_i \pm z_{\alpha/2}\times SE(d_i), \quad SE(d_i)=\sqrt{Var(d_i)} \]

  • Hedges’ g의 경우: \[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]


2.1.3.3 가중값과 평균효과크기

각 연구는 특성이 다르기 때문에 평균효과크기를 계산할 때 각 연구의 특성이 반영되어야 한다. 메타분석에서는 표본의 크기와 관련된 특성을 이용하며, 주로 표본 크기에 비례하는 가중값(weight)을 부과하여 가중평균의 형태로 평균효과크기(mean effect size)를 산출한다.

일반적으로 가장 많이 쓰이는 가중값의 형태는 분산의 역수로, 표본이 클수록 가중값이 커지게 된다.

\[ W_i = \frac{1}{Var_i} \]

평균효과크기는 아래 정의와 같이 가중값을 곱한 효과크기의 합, 즉 가중효과크기의 합을 가중값의 합으로 나눈 가중평균의 형태이며, 그 정의는 다음과 같다.

  • Cohen’s d의 경우:

\[ M_d = \frac{\sum_{i=1}^K w_id_i}{\sum_{i=1}^K w_i} \]

  • Hedges’ g의 경우:

\[ M_g = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i} \]


2.1.3.4 평균효과크기와 그 표준오차(standard error of the mean)

평균효과크기의 표준오차, 신뢰구간, 그리고 유의성 검증을 위한 통계량은 다음과 같다.

  • 평균효과크기: \[M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i}\]

  • 분산과 표준오차: \[V_M = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]

  • 검정 통계량(Test statistic) under \(H_0: M=0\) \[Z=\frac{M}{SE(M)}\]

  • 신뢰구간: \[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]


2.1.3.5 \(t\)값, \(F\)값 및 유의확률(\(p-value\))이 제시된 경우

  • \(t\)값: \[d=\pm t\sqrt{\frac{n_1+n_2}{n_1n_2}}\]

  • \(F\)값: \[d=\sqrt{\frac{F(n_1+n_2)}{n_1n_2}}\]

  • \(p-value\)가 제시된 경우: \[d=\pm t_{p-value}\sqrt{\frac{n_1+n_2}{n_1n_2}}\]

  • \(p<\alpha\)로 제시된 경우: \[d=\pm t_{\alpha}\sqrt{\frac{n_1+n_2}{n_1n_2}}\]


2.1.4 Example

  • Crucial laboratory parameters in COVID-19 diagnosis and prognosis: An updated meta-analysis (Soraya and Ulhaq, 2019)


2.1.4.1 데이터 입력:

두 집단간 비교연구에서 필요한 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 값이다. 여기서는 10개의 개별 연구의 값을 입력한다.

cdata2 <- read.table(text='
study   m1  s1  n1  m2  s2  n2
"Cheng et al"   4.38    134 11  5.63    2.46    15
"Hsih et al"    6.3 0.59    2   6.3 2.67    22
"Liang et al"   5.19    1.47    21  7.21    2.94    84
"Song et al"    5.3 3.48    73  6.8 2.14    231
"Yuanyuan et al"    4.8 2.3 31  4.2 1.5 23
"Zhao et al"    4.92    4.71    19  6.18    6.67    15
"Zhu et al" 5.3 2.1 32  6.3 2.3 84

', header=T)

cdata2
##            study   m1     s1 n1   m2   s2  n2
## 1    Cheng et al 4.38 134.00 11 5.63 2.46  15
## 2     Hsih et al 6.30   0.59  2 6.30 2.67  22
## 3    Liang et al 5.19   1.47 21 7.21 2.94  84
## 4     Song et al 5.30   3.48 73 6.80 2.14 231
## 5 Yuanyuan et al 4.80   2.30 31 4.20 1.50  23
## 6     Zhao et al 4.92   4.71 19 6.18 6.67  15
## 7      Zhu et al 5.30   2.10 32 6.30 2.30  84


2.1.4.2 Standardized mean difference

attach(cdata2)

### 합동분산추정량
sp2 <- ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2)

### 표준오차
sp <- sqrt(sp2)

### 표준화 평균차
d <- (m1 - m2)/sp

cbind(cdata2,sp,d)
##            study   m1     s1 n1   m2   s2  n2        sp           d
## 1    Cheng et al 4.38 134.00 11 5.63 2.46  15 86.517032 -0.01444802
## 2     Hsih et al 6.30   0.59  2 6.30 2.67  22  2.611644  0.00000000
## 3    Liang et al 5.19   1.47 21 7.21 2.94  84  2.717503 -0.74332941
## 4     Song et al 5.30   3.48 73 6.80 2.14 231  2.524881 -0.59408748
## 5 Yuanyuan et al 4.80   2.30 31 4.20 1.50  23  2.000961  0.29985587
## 6     Zhao et al 4.92   4.71 19 6.18 6.67  15  5.651765 -0.22293920
## 7      Zhu et al 5.30   2.10 32 6.30 2.30  84  2.247377 -0.44496324


2.1.4.3 d의 분산, 표준오차 및 신뢰구간

### d의 분산
vard <- 1/n1+1/n2+d^2/(2*(n1+n2))

### D의 표준오차
sed <- sqrt(vard)

### 신뢰 하한 
lb <- d - qnorm(0.975)*sed

### 신뢰 상한 
ub <- d + qnorm(0.975)*sed

data.frame(study=cdata2[,1],d,vard,lb,ub) 
##            study           d       vard         lb          ub
## 1    Cheng et al -0.01444802 0.15757977 -0.7924816  0.76358553
## 2     Hsih et al  0.00000000 0.54545455 -1.4475293  1.44752933
## 3    Liang et al -0.74332941 0.06215495 -1.2319659 -0.25469287
## 4     Song et al -0.59408748 0.01860813 -0.8614493 -0.32672563
## 5 Yuanyuan et al  0.29985587 0.07656886 -0.2424873  0.84219904
## 6     Zhao et al -0.22293920 0.12002916 -0.9019731  0.45609472
## 7      Zhu et al -0.44496324 0.04400818 -0.8561270 -0.03379953


2.1.4.4 가중값

### 가중값
W <- 1/vard

### 가중값 표준화
Wp <- W/sum(W)*100

data.frame(study=cdata2[,1],d,vard,W,Wp)
##            study           d       vard         W        Wp
## 1    Cheng et al -0.01444802 0.15757977  6.345992  5.196411
## 2     Hsih et al  0.00000000 0.54545455  1.833333  1.501224
## 3    Liang et al -0.74332941 0.06215495 16.088824 13.174321
## 4     Song et al -0.59408748 0.01860813 53.739958 44.004922
## 5 Yuanyuan et al  0.29985587 0.07656886 13.060140 10.694285
## 6     Zhao et al -0.22293920 0.12002916  8.331309  6.822086
## 7      Zhu et al -0.44496324 0.04400818 22.723050 18.606751


2.1.4.5 평균효과크기와 분산, 신뢰구간

### 평균효과크기
Md <- sum(W*d)/sum(W)

### 평균효과크기의 분산
varMd <- 1/sum(W)

### 평균효과크기의 표준오차
seMd <- sqrt(varMd)

### 평균효과크기의 신뢰구간
lb <- Md - qnorm(0.975)*seMd
ub <- Md + qnorm(0.975)*seMd

data.frame(Md, varMd, seMd, lb, ub)
##          Md       varMd       seMd         lb         ub
## 1 -0.426042 0.008188492 0.09049029 -0.6033997 -0.2486843


2.1.4.6 Corrected standardized mean difference

### 보정된 표준화 평균차 Hedges' g
J <- (1-3/(4*(n1+n2)-9))
g <- d * J

### g의 분산과 표준오차
varg <- J^2*vard; seg <- sqrt(varg)

### 신뢰 하한 
lbg <- g - qnorm(0.975)*seg

### 신뢰 상한 
ubg <- g + qnorm(0.975)*seg

data.frame(study=cdata2[,1],g,varg,lbg,ubg) 
##            study           g       varg        lbg         ubg
## 1    Cheng et al -0.01399177 0.14778451 -0.7674558  0.73947230
## 2     Hsih et al  0.00000000 0.50848557 -1.3976145  1.39761453
## 3    Liang et al -0.73790365 0.06125089 -1.2229735 -0.25283380
## 4     Song et al -0.59261087 0.01851574 -0.8593082 -0.32591355
## 5 Yuanyuan et al  0.29551014 0.07436555 -0.2389730  0.82999326
## 6     Zhao et al -0.21767292 0.11442546 -0.8806667  0.44532083
## 7      Zhu et al -0.44202942 0.04342976 -0.8504822 -0.03357668


2.1.4.7 가중값

### 가중값
Wg <- 1/varg

### 가중값 표준화
Wpg <- Wg/sum(Wg)*100

data.frame(study=cdata2[,1],g,varg,Wg,Wpg)
##            study           g       varg        Wg       Wpg
## 1    Cheng et al -0.01399177 0.14778451  6.766609  5.444661
## 2     Hsih et al  0.00000000 0.50848557  1.966624  1.582418
## 3    Liang et al -0.73790365 0.06125089 16.326294 13.136734
## 4     Song et al -0.59261087 0.01851574 54.008098 43.456891
## 5 Yuanyuan et al  0.29551014 0.07436555 13.447086 10.820017
## 6     Zhao et al -0.21767292 0.11442546  8.739314  7.031971
## 7      Zhu et al -0.44202942 0.04342976 23.025684 18.527308


2.1.4.8 평균효과크기와 분산, 신뢰구간

### 평균효과크기
Mg <- sum(Wg*g)/sum(Wg)

### 평균효과크기의 분산
varMg <- 1/sum(Wg)

### 평균효과크기의 표준오차
seMg <- sqrt(varMg)

### 평균효과크기의 신뢰구간
lbg <- Mg - qnorm(0.975)*seMg
ubg <- Mg + qnorm(0.975)*seMg

data.frame(Mg, varMg, seMg, lbg, ubg)
##           Mg       varMg       seMg        lbg        ubg
## 1 -0.4204571 0.008046366 0.08970154 -0.5962689 -0.2446453


2.1.5 두 집단(사전-사후검사) 전후 비교조사

두 집단(사전-사후검사)인 경우, 아래와 같이 연구결과에 보고한다. \(D_T\)를 treatment 집단의 사전-사후에 대한 평균값, \(D_C\)를 control 집단의 사전-사후에 대한 평균값이라 할때 효과크기 \(d\)는 다음과 같이 정의한다.

\[ d_{diff}=\frac{\bar{D_T}-\bar{D_C}}{S_{diff_p}} \] 여기서, \(S_{diff_p}\)는 다음과 같다.

\[ S_{diff_p} = \sqrt{\frac{(n_1 -1)S_{diff_1}^2 + (n_2-1)S_{diff_2}^2}{n_1+n_2-2}} \]

효과크기, 분산 등과 평균효과크기의 표준오차, 신뢰구간, 그리고 유의성 검증을 위한 통계량은 다음과 같다.

*효과크기 \(d_{diff}\)의 분산

\[ Var(d_{diff})=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)} \]

  • 보정된 효과크기

\[ g_i = J \times d_{diff}, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \]

  • 보정된 효과크기의 분산

\[ Var(g_i)=J^2\times Var(d_i) \]

  • 효과크기의 신뢰구간

\[ CI(d_{diff})=d_{diff} \pm z_{\alpha/2}\times SE(d_{diff}), \quad SE(d_{diff})=\sqrt{Var(d_{diff})} \]

  • 보정된 효과크기의 신뢰구간

\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]

  • 가중값 \[ W_i = \frac{1}{Var_i} \]

  • 평균효과크기: \[M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i}\]

  • 분산과 표준오차: \[V_M = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]

  • 검정 통계량(Test statistic) under \(H_0: M=0\) \[Z=\frac{M}{SE(M)}\]

  • 신뢰구간: \[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]


2.1.6 단일집단(사전-사후검사)

단일집단(사전-사후검사)인 경우, 두 집단 비교와는 조금 다른 공식을 활용하며, 사전-사후검사의 상관계수가 필요하다. 사후 측정값을 \(X\)로 두고 사전 측정값을 \(Y\), \(r\)은 사전-사후 간의 상관계수, 사전과 사후 측정값의 표준편차를 각각 \(S_1\), \(S_2\)라 할 때 효과크기 \(d_i\)와 그 분산은 다음과 같이 정의한다.

\[ d_i=\frac{\bar{X}-\bar{Y}}{S_p} \]

여기서, \(S_p\)는 다음과 같다.

\[ S_p = \frac{\sqrt{S_1^2+S_2^2-2rS_1S_2}}{\sqrt{2(1-r)}} \]

또한 효과크기 \(d\)의 분산과 표준오차는 다음과 같다.

\[ Var(d_i)=(\frac{1}{n}+\frac{d^2}{2n})\times 2(1-r), \quad SE(d)=\sqrt{Var(d)} \]

보정된 효과크기 \(g\)를 얻기 위한 보정지수(correction factor) \(J\)는 다음과 같다.

\[ J=1-(\frac{3}{4df-1}), \quad df=n-1 \]

  • 효과크기의 신뢰구간

\[ CI(d_i)=d_i \pm z_{\alpha/2}\times SE(d_i), \quad SE(d_i)=\sqrt{Var(d_i)} \]

  • 보정된 효과크기의 신뢰구간

\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]

이후의 과정(신뢰구간, 가중값, 평균효과크기등의 추정)은 다음과 같다.

  • 가중값 \[ W_i = \frac{1}{Var(d_i)} \]

  • 평균효과크기: \[M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i}\]

  • 분산과 표준오차: \[V_M = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]

  • 검정 통계량(Test statistic) under \(H_0: M=0\) \[Z=\frac{M}{SE(M)}\]

  • 신뢰구간: \[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]


2.2 이분형 자료의 효과크기 계산

이분형(binary) 자료의 경우, 효과크기는 평균차이가 아닌 상대위험률(relative resk, RR) 또는 오즈비(odds ratio, OR)를 주로 이용한다.


2.2.0.1 Effect size of binary data

요인의 결과가 각각 두 개의 범주로 나누어진 분할표(\(2\times 2\) contigency table) 자료의 경우 연관성을 나타내는 측도로 주로 사용되는 것은 상대위험률(RR)과 오즈비(OR)이며, 그 정의는 다음과 같다.

집단 Event No-Event Total
실험 \(a\) \(b\) \(n_1\)
통제 \(c\) \(d\) \(n_2\)

상대위험률:

\[ RR=\frac{a/(a+b)}{c/(c+d)}=\frac{a/n_1}{c/n_2}=\frac{an_2}{cn_1} \] 오즈비:

\[ OR = \frac{a/b}{c/d}=\frac{ad}{bc} \]

2.2.0.2 상대위험률과 오즈비의 해석

상대위험률과 오즈비의 해석은 다음과 같다. 예를 들어 상대위험률이 \(RR=2.0\)인 경우, 실험집단이 통제집단에 비해 Event가 발생할 확률이 2배 높다는 의미이다. 그리고 만약 \(RR=0.1\)이라면, 실험집단의 이벤트 발생 확률이 통제집단에 비해 \(95\%\) 낮다는 의미이다. 반면, 오즈비의 경우 \(OR=2.0\)이면, Event가 발생하지 않을 경우에 비해 이벤트가 발생할 경우가 통제집단에 비해 실험집단이 두 배가 된다는 의미이다. 즉, 상대위험률처럼 직접적인 확률의 비로 해석하기가 쉽지 않다. 다만 \(OR\)이 1보다 크다면 실험집단의 Event 발생 가능성이 통제집단보다 크다는 것을 알 수 있으며, Event 발생 확률이 매우 낮다면 \(RR\)\(OR\)값은 거의 같은 값을 보인다.


2.2.1 상대위험률(Relative Risk; RR)

상대위험률과 오즈비는 그대로 사용하지 않고 자연로그 변환값을 사용한다. 로그변환을 취한 경우에는 수치비교가 용이해지며, 범위가 \(-\infty\)에서 \(\infty\) 값을 취하기 때문에 \(0\)의 경우 효과크기가 없음(neutal value)을 나타낸다. 또한, 로그변환을 통해 정규분포에 가깝게 만들 수 있다.

로그 변환후의 \(RR\)은 다음과 같다. \[ Log(RR_i)=log(\frac{a/(a+b)}{c/(c+d)}) \]

로그 변환후의 분산은 다음과 같다.

\(Log(RR)\)의 분산:

\[ Var(Log(RR_i))=\frac{1}{a}-\frac{1}{n_1}+\frac{1}{c}-\frac{1}{n_2} \] 따라서 \(Log(RR)\)의 신뢰구간은 다음과 같이 정의된다. \[ CI=Log(RR_i) \pm z_{\alpha/2}\times SE(Log(RR_i)) \] 상대위험률(RR)에 대한 신뢰구간은 \(Log(RR)\)의 신뢰구간에 지수함수(exponential)를 취해서 산출한다. \[ CI(RR)=exp(Log(RR_i) \pm z_{\alpha/2}\times SE(Log(RR_i))) \] 평균효과크기 산출을 위한 가중값 적용 방법은 역분산(Inverse variance) 방법과 Mantel-Haenszel (MH) 방법이 사용되며 먼저 역분산 방법을 살펴보자.

2.2.1.1 역분산 방법

역분산 방법에서 가중값 \(w\)\(Log(RR)\)의 분산의 역수로 정의된다. \[ w_i = \frac{1}{Var(Log(RR_i))} \] 따라서 로그변환 평균효과크기 \(Log(\theta)\)는 다음과 같다. \[ Log(\theta)=\frac{\sum_{i=1}^K w_i Log(RR_i)}{\sum_{i=1}^K w_i} \] 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.

  • \(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{1}{\sum_{i=1}^K w_i} \]

  • \(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]

따라서 상대위험률의 평균효과크기와 신뢰구간은 다음과 같다.

  • 상대위험률의 평균효과크기

\[ \theta=exp(Log(\theta))=exp(\frac{\sum_{i=1}^K w_i Log(RR_i)}{\sum_{i=1}^K w_i}) \]

  • 상대위험률의 신뢰구간

\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]

2.2.1.2 Mantel-Haenszel (MH) 방법

MH 방법에서 가중값 \(w\)는 역분산 방법과 달리 효과크기 \(RR\)에 직접 정의된다. \[ w_i = \frac{(a+b)c}{n_1+n_2}=\frac{(a+b)c}{n}, \,\,\,n=n_1+n_2 \]

따라서 평균효과크기 \(\theta\)는 다음과 같다. \[ \theta=\frac{\sum_{i=1}^K w_i RR_i}{\sum_{i=1}^K w_i} \] 반면, 평균효과크기 \(\theta\)의 분산은 직접적으로 구할 수 없어 \(Log(\theta)\)로 접근하며, 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.

  • \(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{\sum_{i=1}^K(n_1n_2(a+c)-acn)/n^2}{(\sum_{i=1}^K an_2/n)\times (\sum_{i=1}^K cn_1/n)} \]

  • \(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]

따라서 상대위험률의 신뢰구간은 다음과 같다.

  • 상대위험률의 신뢰구간

\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]

2.2.2 Example

  • A systematic review and meta‑analysis on chloroquine and hydroxychloroquine as monotherapy or combined with azithromycin in COVID‑19 treatment (Ghazy et al., 2020)


2.2.2.1 데이터 입력:

이분형 자료를 위한 연구에서 필요한 값은 각 집단의 표본크기(n1, n2)와 event 발생 횟수(e1, e2) 값이다. 여기서는 8개의 개별 연구의 값을 이용하여 pooled RR값을 산출해보자.

rrdata <- read.table(text='
Study   e1  n1  e2  n2
"B. Yu, 2020"   9   48  238 502
"ES. Rosenberg, 2020"   54  271 28  221
"FJ. MeMbrillo, 2020"   27  123 21  43
"J. Barbosa, 2020"  2   17  1   21
"J. Magagnoli, 2020"    38  1698    37  395
"M. Mahevas, 2020"  9   84  8   89
"P. Gautret, 2020"  1   20  0.5 16
"S. Singh, 2020"    104 910 109 910

', header=T)

rrdata
##                 Study  e1   n1    e2  n2
## 1         B. Yu, 2020   9   48 238.0 502
## 2 ES. Rosenberg, 2020  54  271  28.0 221
## 3 FJ. MeMbrillo, 2020  27  123  21.0  43
## 4    J. Barbosa, 2020   2   17   1.0  21
## 5  J. Magagnoli, 2020  38 1698  37.0 395
## 6    M. Mahevas, 2020   9   84   8.0  89
## 7    P. Gautret, 2020   1   20   0.5  16
## 8      S. Singh, 2020 104  910 109.0 910


2.2.2.2 RR, 효과크기 로그변환, 분산

attach(rrdata)
## The following objects are masked from cdata2:
## 
##     n1, n2
### 효과크기 RR
RR <- e1*n2/e2/n1

### 효과크기 로그변환
logRR <- log(RR)

### Log(RR)의 분산
var_logrr <- 1/e1-1/n1+1/e2-1/n2

cbind(rrdata, RR, logRR, var_logrr)
##                 Study  e1   n1    e2  n2        RR       logRR  var_logrr
## 1         B. Yu, 2020   9   48 238.0 502 0.3954832 -0.92764699 0.09248743
## 2 ES. Rosenberg, 2020  54  271  28.0 221 1.5727464  0.45282342 0.04601788
## 3 FJ. MeMbrillo, 2020  27  123  21.0  43 0.4494774 -0.79966981 0.05327019
## 4    J. Barbosa, 2020   2   17   1.0  21 2.4705882  0.90445627 1.39355742
## 5  J. Magagnoli, 2020  38 1698  37.0 395 0.2389138 -1.43165235 0.05022224
## 6    M. Mahevas, 2020   9   84   8.0  89 1.1919643  0.17560261 0.21297039
## 7    P. Gautret, 2020   1   20   0.5  16 1.6000000  0.47000363 2.88750000
## 8      S. Singh, 2020 104  910 109.0 910 0.9541284 -0.04695698 0.01659189


2.2.2.3 RR의 신뢰구간 계산

### Log(RR)의 신뢰구간
lower_logrr <- logRR - qnorm(0.975)*sqrt(var_logrr)
upper_logrr <- logRR + qnorm(0.975)*sqrt(var_logrr)

### 원 자료의 신뢰구간
lower_rr <- exp(lower_logrr)
upper_rr <- exp(upper_logrr)

### Log(RR)의 가중값 - Mantel Haenszel (MH)
w <- n1*e2/(n1+n2)
wp <- w/sum(w)*100

data.frame(Study=rrdata[,1], RR, lower_rr, upper_rr, wp)
##                 Study        RR   lower_rr   upper_rr         wp
## 1         B. Yu, 2020 0.3954832 0.21790279  0.7177832 14.7436206
## 2 ES. Rosenberg, 2020 1.5727464 1.03290610  2.3947301 10.9473968
## 3 FJ. MeMbrillo, 2020 0.4494774 0.28592204  0.7065908 11.0449807
## 4    J. Barbosa, 2020 2.4705882 0.24432346 24.9824807  0.3175514
## 5  J. Magagnoli, 2020 0.2389138 0.15398708  0.3706792 21.3068291
## 6    M. Mahevas, 2020 1.1919643 0.48244151  2.9449764  2.7572225
## 7    P. Gautret, 2020 1.6000000 0.05724049 44.7235828  0.1971724
## 8      S. Singh, 2020 0.9541284 0.74124875  1.2281452 38.6852265


2.2.2.4 평균효과크기, 표준오차 및 신뢰구간 - MH

### 평균효과크기 theta
theta = sum(w*RR)/sum(w)

### Log(theta)의 분산
varlogtheta = sum((n1*n2*(e1+e2)-e1*e2*(n1+n2))/(n1+n2)**2)/sum(e1*n2/(n1+n2))/sum(e2*n1/(n1+n2))

### Log(theta)의 신뢰구간
lb = log(theta) - qnorm(0.975)*sqrt(varlogtheta)
ub = log(theta) + qnorm(0.975)*sqrt(varlogtheta)

### 상대위험률 평균효과크기의 신뢰구간
lbrr = exp(lb)
ubrr = exp(ub)

cbind(theta, varlogtheta, lbrr, ubrr)
##         theta varlogtheta      lbrr      ubrr
## [1,] 0.744005  0.00687375 0.6324182 0.8752807


2.2.3 오즈비(Odds Ratio; OR)

상대위험률과 마찬가지로 효과크기를 산출하기 위해 오즈비를 그대로 사용하지 않고 자연로그 변환값을 사용한다.

로그 변환후의 \(OR\)은 다음과 같다. \[ Log(OR_i)=log(\frac{ad}{bc}) \]

로그 변환후의 분산은 다음과 같다.

\(Log(OR)\)의 분산:

\[ Var(Log(RR_i))=\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d} \] 따라서 \(Log(OR)\)의 신뢰구간은 다음과 같이 정의된다. \[ CI=Log(OR_i) \pm z_{\alpha/2}\times SE(Log(OR_i)) \] 오즈비(OR)에 대한 신뢰구간은 \(Log(OR)\)의 신뢰구간에 지수함수를 취해서 산출한다. \[ CI(OR)=exp(Log(OR_i) \pm z_{\alpha/2}\times SE(Log(OR_i))) \] 평균효과크기 산출을 위한 가중값 적용 방법은 역분산(Inverse variance) 방법과 Mantel-Haenszel (MH) 방법, Peto 방법이 사용되며 먼저 역분산 방법을 살펴보자.

2.2.3.1 역분산 방법

역분산 방법에서 가중값 \(w\)\(Log(OR)\)의 분산의 역수로 정의된다. \[ w_i = \frac{1}{Var(Log(OR_i))} \] 따라서 로그변환 평균효과크기 \(Log(\theta)\)는 다음과 같다. \[ Log(\theta)=\frac{\sum_{i=1}^K w_i Log(OR_i)}{\sum_{i=1}^K w_i} \] 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.

  • \(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{1}{\sum_{i=1}^K w_i} \]

  • \(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]

따라서 오즈비의 평균효과크기와 신뢰구간은 다음과 같다.

  • 상대위험률의 평균효과크기

\[ \theta=exp(Log(\theta))=exp(\frac{\sum_{i=1}^K w_i Log(OR_i)}{\sum_{i=1}^K w_i}) \]

  • 상대위험률의 신뢰구간

\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]

2.2.3.2 Mantel-Haenszel (MH) 방법

MH 방법에서 가중값 \(w\)는 역분산 방법과 달리 효과크기 \(OR\)에 직접 정의된다. \[ w_i = \frac{bc}{n}, \,\,\,n=n_1+n_2 \]

따라서 평균효과크기 \(\theta\)는 다음과 같다. \[ \theta=\frac{\sum_{i=1}^K w_i OR_i}{\sum_{i=1}^K w_i} \] 반면, 평균효과크기 \(\theta\)의 분산은 직접적으로 구할 수 없어 \(Log(\theta)\)로 접근하며, 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.

  • \(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{\sum_{i=1}^K(bc/n)^2(\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d})}{(\sum_{i=1}^K bc/n)^2} \]

  • \(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]

따라서 상대위험률의 신뢰구간은 다음과 같다.

  • 상대위험률의 신뢰구간

\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]


2.2.3.3 Peto 방법

Peto 방법은 로그변환 OR값을 정의하여 진행된다.

\[ Log(OR_i)=\frac{a-n_1(a+c)/n}{V}, \,\,\, V=\frac{n_1n_2(a+c)(b+c)}{n^2(n-1)} \]

따라서 OR값은 $Log(OR)값에 지수함수를 취하여 역산한다.

\(Log(OR)\)의 분산은 다음과 같다. \[ Var(Log(OR))=\frac{1}{V} \]

이후 효과크기 \(OR\)의 신뢰구간 및 평균효과크기, 평균효과크기의 신뢰구간을 구하는 방법은 역분산법을 이용하는 것과 같다. Peto 방법은 집단 크기가 같고 event 발생이 아주 드문(rate) 경우에 유용하다.

2.2.4 Example

  • A systematic review and meta-analysis of the COVID-19 associated liver injury (Wong et al., 2020)


2.2.4.1 데이터 입력:

이분형 자료를 위한 연구에서 필요한 값은 각 집단의 표본크기(n1, n2)와 event 발생 횟수(e1, e2) 값이다. 여기서는 7개의 개별 연구의 값을 이용하여 pooled OR값을 산출해보자.

ordata <- read.table(text='
Study   e1  n1  e2  n2
"Cai QM 2020"   70  85  117 223
"Cao J 2020"    14  17  34  85
"Chen T 2020"   30  131 30  161
"Du RH 2020"    10  51  8   58
"Guan W 2020"   38  135 120 666
"Zhang G 2020"  24  32  28  63
"Zhou F 2020"   26  54  33  135
', header=T)

ordata
##          Study e1  n1  e2  n2
## 1  Cai QM 2020 70  85 117 223
## 2   Cao J 2020 14  17  34  85
## 3  Chen T 2020 30 131  30 161
## 4   Du RH 2020 10  51   8  58
## 5  Guan W 2020 38 135 120 666
## 6 Zhang G 2020 24  32  28  63
## 7  Zhou F 2020 26  54  33 135


2.2.4.2 OR, 신뢰구간 계산

### 변수의 객체화
attach(ordata)
## The following objects are masked from rrdata:
## 
##     e1, e2, n1, n2, Study
## The following objects are masked from cdata2:
## 
##     n1, n2
### 효과크기 RR
OR <- e1*(n2-e2)/e2/(n1-e1)

### 효과크기 로그변환
logOR <- log(OR)

### Log(OR)의 분산
var_logor <- 1/e1+1/(n1-e1)+1/e2+1/(n2-e2)

cbind(ordata, OR, logOR, var_logor)
##          Study e1  n1  e2  n2       OR     logOR  var_logor
## 1  Cai QM 2020 70  85 117 223 4.227920 1.4417102 0.09893335
## 2   Cao J 2020 14  17  34  85 7.000000 1.9459101 0.45378151
## 3  Chen T 2020 30 131  30 161 1.297030 0.2600768 0.08420124
## 4   Du RH 2020 10  51   8  58 1.524390 0.4215945 0.26939024
## 5  Guan W 2020 38 135 120 666 1.782474 0.5780024 0.04678990
## 6 Zhang G 2020 24  32  28  63 3.750000 1.3217558 0.23095238
## 7  Zhou F 2020 26  54  33 135 2.870130 1.0543573 0.11428278


2.2.4.3 가중값과 평균효과크기, 표준오차 및 신뢰구간 - MH

### Log(OR)의 신뢰구간
lower_logor <- logOR - qnorm(0.975)*sqrt(var_logor)
upper_logor <- logOR + qnorm(0.975)*sqrt(var_logor)

### 효과크기의 신뢰구간
lower_or = exp(lower_logor)
upper_or = exp(upper_logor)

### Log(OR)의 가중값 - Mantel Haenszel (MH)
w = (n1-e1)*e2/(n1+n2)

### 표준화 가중값
wp = w/sum(w)*100

data.frame(Study=ordata[,1], OR, lower_or, upper_or, wp)
##          Study       OR  lower_or  upper_or        wp
## 1  Cai QM 2020 4.227920 2.2824046  7.831788 13.611333
## 2   Cao J 2020 7.000000 1.8693927 26.211722  2.388769
## 3  Chen T 2020 1.297030 0.7344343  2.290588 24.787574
## 4   Du RH 2020 1.524390 0.5511865  4.215933  7.188224
## 5  Guan W 2020 1.782474 1.1665412  2.723620 34.713205
## 6 Zhang G 2020 3.750000 1.4620595  9.618282  5.632467
## 7  Zhou F 2020 2.870130 1.4796078  5.567452 11.678429
### 평균효과크기 theta
theta = sum(w*OR)/sum(w)

### Log(theta)의 분산
varlogtheta = sum(((n1-e1)*e2/(n1+n2))^2*(1/e1+1/(n1-e1)+1/e2+1/(n2-e2)))/sum((n1-e1)*e2/(n1+n2))**2

### Log(theta)의 신뢰구간
lb = log(theta) - qnorm(0.975)*sqrt(varlogtheta)
ub = log(theta) + qnorm(0.975)*sqrt(varlogtheta)

### 오즈비 평균효과크기의 신뢰구간
lbor = exp(lb)
ubor = exp(ub)

cbind(theta, varlogtheta, lbor, ubor)
##         theta varlogtheta     lbor    ubor
## [1,] 2.338926   0.0165869 1.817148 3.01053


2.2.5 위험율 차이(Risk Difference, RD)

이벤트 위험율 차이(risk difference, RD)는 실험집단과 통제집단의 event 발생 비율의 차이를 의미하는 단순한 개념이지만, 임상적인 맥락에서 이해하기란 쉽지 않다. 여기서 risk difference는 상대적 개념이 아니라 절대적 크기 차이를 의미하기 때문에 메타분석에서 사용되는 경우는 흔치 않다.

효과크기 RD의 정의는 다음과 같다. \[ RD=\frac{1}{n_1}-\frac{c}{n_2} \]

효과크기 RD 분산의 정의는 다음과 같다.

\[ Var(RD)=\frac{ab}{n_1^2(n_1-1)}+\frac{cd}{n_2^2(n_2-1)} \]

효과크기 RD의 Mantel-Haenszel 가중값은 다음과 같이 정의한다. \[ w_i=\frac{(a+b)(c+d)}{n}=\frac{n_1n_2}{n}, \,\,\, n=n_1+n_2 \] 또한 Mantel-Haenszel 평균효과크기는 다음과 같다.

\[ \theta=\frac{\sum_{i=1}^K an_2/n-cn_1/n}{\sum_{i=1}^K n_1n_2/n} \]

  • 이때 평균효과크기 \(\theta\)의 분산은 Greenland and Robins (1985)를 참조

평균효과크기 \(\theta\)의 분산을 알경우 신뢰구간은 다음과 같다.

\[ CI=\theta \pm z_{\alpha/2}\sqrt{Var(\theta)} \]

위험율 차이는 절대적인 크기의 개념으로 인해 실제 메타분석에서 잘 쓰이지 않고 대신 NNT (number needed to treat; NNT)의 개념을 사용하기도 한다. NNT는 어떤 positive(+) Event가 발생할 케이스를 하나 더 추가하기 위해 필요한 (치료를 받아야 할) 케이스 수를 의미한다. 예를 들어, TB 예방을 위한 백신접종 연구에서 NNT=5이면 TB가 발생할 케이스를 하나 더 얻기 위해 5명의 케이스가 백신을 접종받아야 한다. 즉 NNT=1/RD, 곧 RD의 역수로서 RD가 작을수록 NNT는 커진다.


2.3 Time to event 자료의 효과크기 계산

Time to event 자료의 경우 효과크기는 hazard ratio (HR)를 주로 이용하며, RR 및 OR과 마찬가지로 자연로그 변환값을 사용하여 효과크기에 대한 신뢰구간을 산출한다.

HR에 대한 평균효과크기를 구하기 위해 Log(HR)에 대한 SE값이 직접적으로 주어진 경우. 역분산법을 이용하여 평균효과크기를 직접적으로 추정할 수 있으며, HR에 대한 신뢰구간이 주어진 경우 이를 이용한 Log(HR)에 대한 분산은 다음과 같이 구할 수 있다(자세한 사항은 Tierney et al., 2007 참조).

신뢰구간을 이용한 Log(HR)의 분산은 다음과 같다. \[ Var(Log(HR_i))=(\frac{log(upperCI)-log(lowerCI)}{2\times z_{\alpha/2}})^2 \]

\(Log(HR)\)의 신뢰구간은 다음과 같이 정의된다. \[ CI=Log(HR_i) \pm z_{\alpha/2}\times SE(Log(HR_i)) \]

따라서 위험비(HR)에 대한 신뢰구간은 \(Log(HR)\)의 신뢰구간에 지수함수를 취해서 산출한다. \[ CI(HR)=exp(Log(HR_i) \pm z_{\alpha/2}\times SE(Log(HR_i))) \]

\(Log(HR)\)의 가중값 \(w\)\(Log(HR)\)의 분산의 역수로 정의된다. \[ w_i = \frac{1}{Var(Log(HR_i))} \]

따라서 로그변환 평균효과크기 \(Log(\theta)\)는 다음과 같다. \[ Log(\theta)=\frac{\sum_{i=1}^K w_i Log(HR_i)}{\sum_{i=1}^K w_i} \]

이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.

  • \(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{1}{\sum_{i=1}^K w_i} \]

  • \(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]

따라서 위험비의 평균효과크기와 신뢰구간은 다음과 같다.

  • 상대위험률의 평균효과크기

\[ \theta=exp(Log(\theta))=exp(\frac{\sum_{i=1}^K w_i Log(HR_i)}{\sum_{i=1}^K w_i}) \]

  • 상대위험률의 신뢰구간

\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]

2.3.1 Example

  • A meta-analysis of adjusted hazard ratios from 20 observational studies of bilateral versus single internal thoracic artery coronary artery bypass grafting (Takagi et al., 2014)


2.3.1.1 데이터 입력:

hrdata <- read.table(text='
study loghr se_loghr
APPROACH(2011)  -0.1424 0.1166
Bonacchi(2006)  -0.4055 0.6551
Buxton(1998)    -0.3415 0.1256
Carrier_p(2009) -0.0781 0.162
Carrier_n(2009) -0.4368 0.1197
DiMauro(2005)   -0.5306 0.2349
Endo(2001)  -0.0502 0.1787
Glineur(2012)   -0.298  0.1259
Grau(2012)  -0.3955 0.1126
Joo(2012)   -0.0125 0.2648
Kelly(2012) -0.2008 0.1004
Kinoshita(2012) -0.5906 0.2962
Kurlansky(2010) -0.1778 0.0426
Locker_only(2012)   -0.2247 0.1904
Locker_RA(2012) -0.1434 0.2412
Locker_SV(2012) -0.312  0.1276
Lytle(2004) -0.2739 0.0704
Navia(2013) -0.0194 0.343
Parsa(2013) -0.0547 0.067
Pick(1997)  -0.2002 0.2489
Puskas(2012)    -0.4309 0.1546
Stevens(2004)   -0.3081 0.1034
Toumpoulis(2006)    -0.12   0.1281
', header=T)

hrdata
##                study   loghr se_loghr
## 1     APPROACH(2011) -0.1424   0.1166
## 2     Bonacchi(2006) -0.4055   0.6551
## 3       Buxton(1998) -0.3415   0.1256
## 4    Carrier_p(2009) -0.0781   0.1620
## 5    Carrier_n(2009) -0.4368   0.1197
## 6      DiMauro(2005) -0.5306   0.2349
## 7         Endo(2001) -0.0502   0.1787
## 8      Glineur(2012) -0.2980   0.1259
## 9         Grau(2012) -0.3955   0.1126
## 10         Joo(2012) -0.0125   0.2648
## 11       Kelly(2012) -0.2008   0.1004
## 12   Kinoshita(2012) -0.5906   0.2962
## 13   Kurlansky(2010) -0.1778   0.0426
## 14 Locker_only(2012) -0.2247   0.1904
## 15   Locker_RA(2012) -0.1434   0.2412
## 16   Locker_SV(2012) -0.3120   0.1276
## 17       Lytle(2004) -0.2739   0.0704
## 18       Navia(2013) -0.0194   0.3430
## 19       Parsa(2013) -0.0547   0.0670
## 20        Pick(1997) -0.2002   0.2489
## 21      Puskas(2012) -0.4309   0.1546
## 22     Stevens(2004) -0.3081   0.1034
## 23  Toumpoulis(2006) -0.1200   0.1281


2.3.1.2 HR, 효과크기 로그변환, 분산

attach(hrdata)
## The following object is masked from cdata2:
## 
##     study
### 효과크기 HR
HR <- exp(loghr)

### Log(HR)의 분산
var_loghr <- se_loghr^2

cbind(hrdata, HR, var_loghr)
##                study   loghr se_loghr        HR  var_loghr
## 1     APPROACH(2011) -0.1424   0.1166 0.8672743 0.01359556
## 2     Bonacchi(2006) -0.4055   0.6551 0.6666434 0.42915601
## 3       Buxton(1998) -0.3415   0.1256 0.7107035 0.01577536
## 4    Carrier_p(2009) -0.0781   0.1620 0.9248719 0.02624400
## 5    Carrier_n(2009) -0.4368   0.1197 0.6461006 0.01432809
## 6      DiMauro(2005) -0.5306   0.2349 0.5882519 0.05517801
## 7         Endo(2001) -0.0502   0.1787 0.9510392 0.03193369
## 8      Glineur(2012) -0.2980   0.1259 0.7423013 0.01585081
## 9         Grau(2012) -0.3955   0.1126 0.6733433 0.01267876
## 10         Joo(2012) -0.0125   0.2648 0.9875778 0.07011904
## 11       Kelly(2012) -0.2008   0.1004 0.8180760 0.01008016
## 12   Kinoshita(2012) -0.5906   0.2962 0.5539948 0.08773444
## 13   Kurlansky(2010) -0.1778   0.0426 0.8371098 0.00181476
## 14 Locker_only(2012) -0.2247   0.1904 0.7987558 0.03625216
## 15   Locker_RA(2012) -0.1434   0.2412 0.8664074 0.05817744
## 16   Locker_SV(2012) -0.3120   0.1276 0.7319815 0.01628176
## 17       Lytle(2004) -0.2739   0.0704 0.7604081 0.00495616
## 18       Navia(2013) -0.0194   0.3430 0.9807870 0.11764900
## 19       Parsa(2013) -0.0547   0.0670 0.9467691 0.00448900
## 20        Pick(1997) -0.2002   0.2489 0.8185670 0.06195121
## 21      Puskas(2012) -0.4309   0.1546 0.6499239 0.02390116
## 22     Stevens(2004) -0.3081   0.1034 0.7348418 0.01069156
## 23  Toumpoulis(2006) -0.1200   0.1281 0.8869204 0.01640961


2.3.1.3 HR의 신뢰구간 계산

### Log(RR)의 신뢰구간
lower_loghr <- loghr - qnorm(0.975)*se_loghr
upper_loghr <- loghr + qnorm(0.975)*se_loghr

### 원 자료의 신뢰구간
lower_hr <- exp(lower_loghr)
upper_hr <- exp(upper_loghr)

### Log(RR)의 가중값 - Mantel Haenszel (MH)
w <- 1/var_loghr
wp <- w/sum(w)*100

data.frame(Study=hrdata[,1], HR, lower_hr, upper_hr, wp)
##                Study        HR  lower_hr  upper_hr         wp
## 1     APPROACH(2011) 0.8672743 0.6900910 1.0899500  3.9414529
## 2     Bonacchi(2006) 0.6666434 0.1846169 2.4072196  0.1248643
## 3       Buxton(1998) 0.7107035 0.5556196 0.9090742  3.3968327
## 4    Carrier_p(2009) 0.9248719 0.6732664 1.2705046  2.0418480
## 5    Carrier_n(2009) 0.6461006 0.5109888 0.8169378  3.7399444
## 6      DiMauro(2005) 0.5882519 0.3712070 0.9322032  0.9711524
## 7         Endo(2001) 0.9510392 0.6700214 1.3499203  1.6780478
## 8      Glineur(2012) 0.7423013 0.5799813 0.9500501  3.3806638
## 9         Grau(2012) 0.6733433 0.5399969 0.8396182  4.2264590
## 10         Joo(2012) 0.9875778 0.5877236 1.6594703  0.7642184
## 11       Kelly(2012) 0.8180760 0.6719439 0.9959885  5.3160128
## 12   Kinoshita(2012) 0.5539948 0.3100129 0.9899918  0.6107779
## 13   Kurlansky(2010) 0.8371098 0.7700541 0.9100047 29.5280144
## 14 Locker_only(2012) 0.7987558 0.5499779 1.1600663  1.4781536
## 15   Locker_RA(2012) 0.8664074 0.5400231 1.3900550  0.9210831
## 16   Locker_SV(2012) 0.7319815 0.5700157 0.9399688  3.2911835
## 17       Lytle(2004) 0.7604081 0.6624028 0.8729137 10.8120520
## 18       Navia(2013) 0.9807870 0.5007403 1.9210418  0.4554757
## 19       Parsa(2013) 0.9467691 0.8302590 1.0796291 11.9372376
## 20        Pick(1997) 0.8185670 0.5025626 1.3332706  0.8649752
## 21      Puskas(2012) 0.6499239 0.4800282 0.8799505  2.2419941
## 22     Stevens(2004) 0.7348418 0.6000392 0.8999287  5.0120150
## 23  Toumpoulis(2006) 0.8869204 0.6899947 1.1400492  3.2655413


2.3.1.4 평균효과크기, 표준오차 및 신뢰구간

### 평균효과크기 Log(theta)
logtheta = sum(w*loghr)/sum(w)

### Log(theta)의 분산
varlogtheta = 1/sum(w)

### Log(theta)의 신뢰구간
lb = logtheta - qnorm(0.975)*sqrt(varlogtheta)
ub = logtheta + qnorm(0.975)*sqrt(varlogtheta)

### 위험비 평균효과크기의 신뢰구간
theta = exp(logtheta)
lbrr = exp(lb)
ubrr = exp(ub)

cbind(theta, varlogtheta, lbrr, ubrr)
##          theta  varlogtheta      lbrr      ubrr
## [1,] 0.8047614 0.0005358626 0.7690648 0.8421149


2.4 상관관계 자료의 효과크기 계산

효과크기 계산에 있어서 상관관계 자료는 계산이 가장 용이한 자료이다. 상관관계 자료(correlational data)인 경우 효과크기를 계산하는 공식은 다음과 같다. 여기서 피셔의 상관계수(Fisher’s \(Z\))가 상관계수 \(r\)보다 정규분포를 더 따르기 때문에 Fisher’s \(Z\)로 전환하여 사용한다.

Fisher’s \(Z\):

\[ Z=0.5\times ln(\frac{1+r}{1-r}) \]

Fisheer’s \(Z\) 분산:

\[ Var(Z)=\frac{1}{n-3}, \quad SE(Z)=\sqrt{Var(Z)} \]

반대로 Fisher’s \(Z\)를 상관계수 \(r\)로 전환하는 식은 다음과 같다.

상관계수 \(r\):

\[ r=\frac{e^{2Z}-1}{e^{2Z}+1} \] \(r\)의 분산:

\[ Var(r)=\frac{(1-r^2)^2}{n-1} \]

2.5 효과크기의 상호 전환

다양한 유형의 자료로부터 계산된 효과크기는 아래 그림과 같이 상호 전환이 가능하며, 그 공식은 다음과 같다(Borenstein et al., 2009).

표준화된 평균 차이(\(d\))에서 로그승산비(log odds ratio)로 전환방법은 다음과 같다.

\[ Log(OR)=d\frac{\pi}{\sqrt{3}} \] \[ Var(log(OR))=Var(d)\frac{\pi^2}{3} \]

로그승산비에서 표준화된 평균 차이로 전환하는 방법은 다음과 같다.

\[ d=log(OR)\frac{\sqrt{3}}{\pi} \] \[ Var(d)=Var(log(OR))\frac{3}{\pi^2} \]

상관계수(\(r\))에서 표준화된 평균 차이(\(d\))로 전환하는 방법은 다음과 같다.

\[ d=\frac{2r}{\sqrt{1-r^2}} \] \[ Var(d)=\frac{4Var(r)}{(1-r^2)^3} \]

표준화된 평균 차이(\(d\))에서 상관계수(\(r\))로 전환하는 경우 공식은 다음과 같다.

\[ r=\frac{d}{\sqrt{d^2+a}} \] 만약, \(n_1 \ne n_2\)이면 교정지수 \(a\)

\[ a=\frac{(n_1+n_2)^2}{n_1n_2} \] 만약, \(n_1\)\(n_2\)를 정확히 알 수 없다면 \(n_1=n_2\)라고 가정하고 \(a=4\)를 이용한다

\[ Var(r)=\frac{a^2Var(d)}{(d^2+a)^3} \]

3 고정효과모형과 랜덤효과모형

3.1 Fixed vs. Random effect model


3.1.1 고정효과모형과 랜덤효과모형의 의미

메타분석에서 고정효과모형(fixed effect model)과 랜덤효과모형(random effet model)은 실제 효과크기(true effect size)를 어떻게 가정하느냐에 따라 달라진다. 즉 연구자가 평균효과크기를 계산할 때 두 가지 방법 중 어떤 방법을 선택해서 계산하느냐에 따라 평균효과크기의 추정값이 달라지고 그에 따라 평균효과크기의 정밀성(precision)도 달라진다.

고정효과모형 랜덤효과모형
가정: 모든 연구의 모집단 효과크기는 동일하다. (모집단 효과크기의 동질성) 가정: 각 연구는 대상자, 개입방법, 기간 등이 서로 다르기 때문에 개별 연구의 모집단 효과크기는 서로 다르다. (모집단 효과크기의 이질성)
목적: 동일한 모집단의 효과, 즉 one true effect (common effect)를 추정한다. 목적: 서로 상이한 모집단의 효과크기 분포의 평균을 추정한다.
각 연구의 효과크기 차이는 표본오차(sampling error)에 기인한다. 각 연구의 효과크기 차이는 표본오차와 연구 간 분산(between-study variance)으로 구성된다.
평균효과크기는 각 연구의 동일한 모집단 효과크기를 추정한 값이다. 평균효과크기는 각 연구의 서로 상이한 모집단 효과크기 분포의 추정 평균값이다.
표본크기가 커지면 표준오차는 0에 가까워진다. 표본크기가 크고 동시에 연구의 규모도 커지면 표준오차는 0에 가까워진다.

고정효과모형과 랜덤효과모형을 그림으로 설명하면 다음과 같다.

고정효과모형: 관찰된 효과크기는 실제(true) 하나의 효과 크기 \(\theta\)로 부터 발생하고 표본오차(sampling error)에 의해서만 차이가 발생한다고 가정한다. 이를 표현하면 다음과 같다.

\[ \theta_k = \theta + \epsilon_k \]

랜덤효과모형: 랜덤효과모형은 고정효과모형에서 가정하는 표본오차(\(\epsilon_k\)) 외에도 연구 간 발생하는 실제 효과크기의 분포를 고려하고, 때문에 연구 간 실제 효과크기가 서로 다를 수 있음을 가정한다. 이를 \(\zeta_k\)로 표현하고 관측된 \(\theta_k\)는 다음과 같이 표현된다.

\[ \theta_k=\mu+\epsilon_k +\zeta_k \]

여기서 circle은 모집단 효과크기이며 square는 관찰된 효과크기를 의미한다.

그림에서 보는 것처럼 고정효과모형은 각 연구 간 관찰된 효과크기는 서로 다르지만 추정하고자 하는 모집단의 효과크기는 동일하다. 즉 연구 간 효과크기가 서로 다른것은 표본오차에 의한 것이다. 반면 랜덤효과모형은 각 연구 간 관찰된 효과크기가 서로 다르며 추정하고자 하는 모집단의 효과크기도 각각 다르다. 이것은 표본오차에 의한 차이, 즉 연구 내 분산(within-study variance) 뿐 아니라 연구 간 분산(between-study variance)이 존재하기 때문이다.

고정효과모형과 랜덤효과모형의 차이점은 다음과 같다.

고정효과모형 랜덤효과모형
각 연구들이 기능적으로 동일(identical)하다. 각 연구들의 표본, 개입방법 등이 서로 다르다.
효과크기의 동질성(homogeneity of effect)을 가정한다. 따라서 각 연구의 연구 간 분산은 0으로 고정한다. 효과크기의 이질성(heterogenety of effect)을 가정하고 연구 간 분산을 인정한다.
각 연구의 가중값은 매우 다르다. 가중값이 보다 균형적이고 표준오차가 크다. 따라서 신뢰구간이 더 길다.
기능적으로 동일한 연구이며, 연구 결과의 적용을 일반화하기보다는 특정 집단에 한정하고자 하는 경우 사용한다. 각 연구는 연구자들에 의해 독립적으로 이루어진 것이며, 연구 결과를 다른 집단에도 일반화하여 적용하고자 하는 경우에 사용한다.
  • 효과크기의 계산 모형(computational model) 선택은, 즉 평균효과크기를 계산할 때 고정효과모형을 선택할 것인가 아니면 랜덤효과모형을 선택할 것인가는 각 연구들이 동일한 모집단의 효과크기를 가정하고 있는지, 그리고 분석의 목적이 무엇인지에 따라 결정되어야 한다.


3.1.2 고정효과모형과 랜덤효과모형의 적용 과정

3.1.2.1 고정효과모형

고정효과모형의 적용 과정을 살펴보기 위해 표준화 평균차를 기준으로 살펴보자. 표준화 평균차 \(d_i\)와 그 분산은 다음과 같다.

  • 표준화 평균차:

\[ d_i = \frac{\bar{X_1}-\bar{X_2}}{S_p} \]

여기서 \(S_p\)는 합동표준편차를 의미하며, \(S_p\)는 다음과 같다.

\[ S_p = \sqrt{\frac{(n_1 -1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2}} \]

개별 연구의 표준화 평균차 \(d_i\)의 분산은 다음과 같이 정의한다.

\[ Var(d_i)=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)}=\frac{n_1+n_2}{n_1n_2}+\frac{d_i^2}{2(n_1+n_2)} \]

  • 보정된 표준화 평균차 \(g_i\)

\[ g_i = J \times d_i, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \]

\(g_i\)의 분산은 다음과 같다.

\[ Var(g_i)=J^2\times Var(d_i) \]

따라서 보정된 표준화 평균차의 신뢰구간은 다음과 같다.

\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]

고정효과모형의 평균효과크기와 분산은 다음과 같다.

평균효과크기 \(M\): \[ M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i} \]

여기서 \(w_i=\frac{1}{Var(g_i)}\)이다.

  • 평균효과크기 \(M\)의 분산과 표준오차:

\[Var(M) = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]

이때, 귀무가설 \(H_0: M=0\) 하에서 검정통계량은

\[Z=\frac{M}{SE(M)}\]

이며, 신뢰구간은 다음과 같다.

\[CI=(M-z_{\alpha/2}\times SE(M),\,\,\, M+z_{\alpha/2}\times SE(M))\]


3.1.2.2 랜덤효과모형

랜덤효과모형은 고정효과모형과 기본적인 과정에서 차이가 없으며, 다만 평균효과크기를 추정 할 때 적용되는 분산이 달라진다. 랜덤효과모형의 적용 과정을 살펴보기 위해 고정효과모형과 같이 표준화 평균 차를 기준으로 살펴보자. 표준화 평균차 \(d_i\)와 분산은 다음과 같다.

표준화된 평균 차이: \[ d_i = \frac{\bar{X_1}-\bar{X_2}}{S_p} \]

여기서 \(S_p\)는 합동표준편차를 의미하며, \(S_p\)는 다음과 같다.

\[ S_p = \sqrt{\frac{(n_1 -1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2}} \]

개별 연구의 표준화된 평균 차이 \(d_i\)의 분산은 다음과 같이 정의한다.

\[ Var(d_i)=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)}=\frac{n_1+n_2}{n_1n_2}+\frac{d_i^2}{2(n_1+n_2)} \]

교정된 표준화된 평균 차이

\[ g_i = J \times d, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \]

\(g_i\)의 분산은 다음과 같다.

\[ Var(g_i)=J^2\times Var(d_i) \]

따라서 교정된 표준화된 평균 차이의 신뢰구간은 다음과 같다.

\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]

랜덤효과모형의 평균효과크기와 분산은 다음과 같다.

  • 평균효과크기 \(M\):

\[ M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i} \]

여기서, \(w_i=\frac{1}{Var(g_i)*}\)이며 \(Var(g_i)*\)\(Var(g_i)*=Var(g_i)+\tau^2\)이다.

연구 간 분산을 의미하는 \(\tau^2\)은 다음과 같이 정의한다.

\[ \tau^2=\frac{Q-df}{C}, \quad df=K-1 \]

여기서, \(Q=\sum_{i=1}^K w_ig_i^2 - \frac{(\sum_{i=1}^K w_ig_i)^2}{\sum_{i=1}^Kw_i}\), \(C=\sum_{i=1}^K w_i - \frac{\sum_{i=1}^K w_i^2}{\sum_{i=1}^K w_i}\)이다.

평균효과크기 \(M\)의 분산과 표준오차:

\[Var(M) = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{Var(M)}\]

이때, 귀무가설 \(H_0: M=0\) 하에서 검정통계량은

\[Z=\frac{M}{SE(M)}\]

이며, 신뢰구간은 다음과 같다.

\[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]

따라서 고정효과모형과 랜덤효과모형에서 평균효과크기를 계산할때 차이점은 랜덤효과모형의 가중값 산출시 연구 간 분산 \(\tau^2\)이 더해지며 이로 인해 가중평균, 분산, 신뢰구간의 크기가 달라지게 된다.

3.1.3 Example

  • A meta-analysis of potential biomarkers associated with severity of coronavirus disease 2019 (COVID-19) (Danwang et al., 2020)


3.1.3.1 데이터 입력:

두 집단간 비교연구에서 필요한 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 값이다. 여기서는 10개의 개별 연구의 값을 입력한다.

random <- read.table(text='
Study   m1  s1  n1  m2   s2 n2
Wang,R  0.74    0.3111  25  1.11    0.4 100
Feng,Y  0.82    0.437   70  1.13    0.5481  352
Cai,Q   0.98    0.4 58  1.34    0.6148  240
Wan,S   0.8 0.2963  40  1.2 0.5926  95
Ki,K    0.7 0.3778  25  1.23    0.363   58
Zheng,F 0.85    0.2741  30  1.12    0.4519  131
Guan,W  0.8 0.2963  153 1   0.4444  726
Zhang,J 0.7 0.3704  56  0.8 0.4444  82
Wang,D  0.8 0.2963  36  0.9 0.4444  102
Mao,L   0.9 1.8519  88  1.3 1.6296  126
Qin,C   0.8 0.3704  286 1   0.4444  166
Yun,L   0.78    0.4148  21  1.14    0.4741  271
', header=T)

random
##      Study   m1     s1  n1   m2     s2  n2
## 1   Wang,R 0.74 0.3111  25 1.11 0.4000 100
## 2   Feng,Y 0.82 0.4370  70 1.13 0.5481 352
## 3    Cai,Q 0.98 0.4000  58 1.34 0.6148 240
## 4    Wan,S 0.80 0.2963  40 1.20 0.5926  95
## 5     Ki,K 0.70 0.3778  25 1.23 0.3630  58
## 6  Zheng,F 0.85 0.2741  30 1.12 0.4519 131
## 7   Guan,W 0.80 0.2963 153 1.00 0.4444 726
## 8  Zhang,J 0.70 0.3704  56 0.80 0.4444  82
## 9   Wang,D 0.80 0.2963  36 0.90 0.4444 102
## 10   Mao,L 0.90 1.8519  88 1.30 1.6296 126
## 11   Qin,C 0.80 0.3704 286 1.00 0.4444 166
## 12   Yun,L 0.78 0.4148  21 1.14 0.4741 271


3.1.3.2 Standardized mean difference

attach(random)
## The following objects are masked from ordata:
## 
##     n1, n2, Study
## The following objects are masked from rrdata:
## 
##     n1, n2, Study
## The following objects are masked from cdata2:
## 
##     m1, m2, n1, n2, s1, s2
### 합동분산추정량
sp2 <- ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2)

### 표준오차
sp <- sqrt(sp2)

### 표준화 평균차
d <- (m1 - m2)/sp

cbind(random,sp,d)
##      Study   m1     s1  n1   m2     s2  n2        sp          d
## 1   Wang,R 0.74 0.3111  25 1.11 0.4000 100 0.3842721 -0.9628595
## 2   Feng,Y 0.82 0.4370  70 1.13 0.5481 352 0.5314447 -0.5833157
## 3    Cai,Q 0.98 0.4000  58 1.34 0.6148 240 0.5796580 -0.6210559
## 4    Wan,S 0.80 0.2963  40 1.20 0.5926  95 0.5233954 -0.7642406
## 5     Ki,K 0.70 0.3778  25 1.23 0.3630  58 0.3674473 -1.4423836
## 6  Zheng,F 0.85 0.2741  30 1.12 0.4519 131 0.4250532 -0.6352146
## 7   Guan,W 0.80 0.2963 153 1.00 0.4444 726 0.4224675 -0.4734092
## 8  Zhang,J 0.70 0.3704  56 0.80 0.4444  82 0.4160616 -0.2403490
## 9   Wang,D 0.80 0.2963  36 0.90 0.4444 102 0.4114126 -0.2430650
## 10   Mao,L 0.90 1.8519  88 1.30 1.6296 126 1.7242977 -0.2319785
## 11   Qin,C 0.80 0.3704 286 1.00 0.4444 166 0.3991296 -0.5010904
## 12   Yun,L 0.78 0.4148  21 1.14 0.4741 271 0.4702505 -0.7655495



3.1.3.3 Corrected standardized mean difference

### d의 분산
vard <- 1/n1+1/n2+d^2/(2*(n1+n2))

### D의 표준오차
sed <- sqrt(vard)


### 보정된 표준화 평균차 Hedges' g
J <- (1-3/(4*(n1+n2)-9))
g <- d * J

### g의 분산과 표준오차
varg <- J^2*vard; seg <- sqrt(varg)

### 신뢰 하한 
lbg <- g - qnorm(0.975)*seg

### 신뢰 상한 
ubg <- g + qnorm(0.975)*seg

data.frame(study=random[,1],g,varg,lbg,ubg) 
##      study          g        varg        lbg        ubg
## 1   Wang,R -0.9569764 0.053054084 -1.4084242 -0.5055287
## 2   Feng,Y -0.5822734 0.017467184 -0.8413091 -0.3232378
## 3    Cai,Q -0.6194810 0.021943492 -0.9098170 -0.3291449
## 4    Wan,S -0.7599229 0.037264848 -1.1382764 -0.3815694
## 5     Ki,K -1.4289868 0.068484235 -1.9418994 -0.9160742
## 6  Zheng,F -0.6322136 0.041822032 -1.0330348 -0.2313924
## 7   Guan,W -0.4730043 0.008027091 -0.6486053 -0.2974032
## 8  Zhang,J -0.2390211 0.029928110 -0.5780898  0.1000476
## 9   Wang,D -0.2417221 0.037379280 -0.6206561  0.1372119
## 10   Mao,L -0.2311569 0.019288512 -0.5033627  0.0410490
## 11   Qin,C -0.5002548 0.009765704 -0.6939415 -0.3065681
## 12   Yun,L -0.7635679 0.052042157 -1.2106896 -0.3164462


3.1.3.4 가중값

### w
w <- 1/varg

### Q
Q = sum(w*g^2)-(sum(w*g))^2/sum(w)

### C
C = sum(w) - sum(w^2)/sum(w)

### tau
df = dim(random)[1]-1
tau2 = (Q - df)/C

### 가중값
wg <- 1/(varg+tau2)

### 가중값 표준화
wpg <- wg/sum(wg)*100

data.frame(study=random[,1],g,varg,wg,wpg)
##      study          g        varg        wg       wpg
## 1   Wang,R -0.9569764 0.053054084 11.088777  6.070777
## 2   Feng,Y -0.5822734 0.017467184 18.316908 10.027964
## 3    Cai,Q -0.6194810 0.021943492 16.928874  9.268056
## 4    Wan,S -0.7599229 0.037264848 13.442300  7.359261
## 5     Ki,K -1.4289868 0.068484235  9.468673  5.183818
## 6  Zheng,F -0.6322136 0.041822032 12.666370  6.934462
## 7   Guan,W -0.4730043 0.008027091 22.146298 12.124441
## 8  Zhang,J -0.2390211 0.029928110 14.913066  8.164461
## 9   Wang,D -0.2417221 0.037379280 13.421654  7.347958
## 10   Mao,L -0.2311569 0.019288512 17.725564  9.704220
## 11   Qin,C -0.5002548 0.009765704 21.325196 11.674912
## 12   Yun,L -0.7635679 0.052042157 11.214617  6.139670


3.1.3.5 평균효과크기와 분산, 신뢰구간

### 평균효과크기
Mg <- sum(wg*g)/sum(wg)

### 평균효과크기의 분산
varMg <- 1/sum(wg)

### 평균효과크기의 표준오차
seMg <- sqrt(varMg)

### 평균효과크기의 신뢰구간
lbg <- Mg - qnorm(0.975)*seMg
ubg <- Mg + qnorm(0.975)*seMg

data.frame(Mg, varMg, seMg, lbg, ubg)
##           Mg       varMg       seMg        lbg        ubg
## 1 -0.5700837 0.005474703 0.07399124 -0.7151038 -0.4250635


3.2 효과크기의 이질성

3.2.1 효과크기의 이질성

메타분석의 목표는 단순히 효과크기의 평균을 도출하는데 있지 않고 효과크기의 전체 패턴(pattern of effect sizes)을 이해하는 데 있다. 일반적으로 메타분석을 하게 되면 각 개별 연구로부터 도출된 추정된 모집단의 효과크기는 서로 다르게 나타나게 되는데, 이러한 효과크기간의 차이(differnces in effect sizes)를 효과크기의 이질성(heterogeneity)이라고 부른다. 즉 효과크기의 이질성은 각 연구로부터 나타난 효과크기의 분포(dispersion of effect sizes) 정도를 의미하며, 연구 간 효과크기가 일관되지 않은 정도를 의미한다(inconsistency across studies).

메타분석에서 이질성을 평가하는 것은 매우 중요하다. 실제 효과가 다른 두 개 이상의 연구가 하위 그룹으로 존재하기 때문에 높은 이질성이 발생할 수 있다. 이러한 정보는 연구에 매우 유용하게 쓰일 수 있다. 왜냐하면 이를 통해 효과가 더 낮거나 더 높은 특정 중재나 집단을 찾을 수 있기 때문이다. 통계적 관점에서도 높은 이질성은 문제가 되며, 특히 매우 높은 이질성은 연구에 공통점이 없음을 뜻하고 “실제” 진정한 효과가 없음을 의미 할 수 있다. 즉, 합동 효과를 보고하는 것 자체가 전혀 의미 없을 수도 있다 (Borenstein et al. 2011).

  • 연구간 이질성의 예:

* A practical guide to meta-analysis (Chung et al., 2006)

메타분석에서 발생하는 효과크기 이질성은 크게 세가지 유형으로 구분된다.

  1. 임상적 이질성: 연구의 표본 간 특성 차이로 발생한다. 예를 들어, 한 연구는 노인을 대상으로 한 연구이고 다른 연구는 대부분 아주 어린 연구 참가자를 모집한 경우 연구간 표본 차이로 인한 이질성이 발생한다.

  2. 통계적 이질성: 수집 된 효과크기 자료에서 발생하는 통계적 이질성을 의미한다. 이러한 이질성은 임상적 관점(예: 연구마다 효과가 크게 다르기 때문에 치료가 매우 또는 미미하게 효과가 있는지 알 수 없는 경우) 또는 통계적 관점 (이질성으로 인해 pooled 효과크기의 신뢰도에 대한 문제)에서 중요하게 작용한다.

  3. 기타 다른 이질성(예: 연구 디자인과 관련된 이질성)

임상적 이질성과 기타 이질성은 개별 연구 검색 시 잘 정의된 중재 유형, 모집단 및 그 결과로 제한함으로써 어느 정도 통제할 수 있다.


3.2.2 이질성 통계량 - \(Q\), \(\tau^2\)\(I^2\)

각 연구로부터 도출된 결과, 즉 효과크기의 이질성의 정도를 나타내는 통계량(heterogeneity statistics)으로 활용되는 것으로 Cochran’s \(Q\), \(\tau^2\)\(I^2\) 세 가지가 있다. \(\tau^2\)\(I^2\)을 이해하고 계산하기 위해서는 먼저 효과크기의 동질성 검정(test of homogeneity)에 사용되는 \(Q\)값과 \(df\)를 이해해야 한다.

\(Q\)값은 메타분석에 있어서 각 효과크기들의 관찰된 분산(observed weighted sum of squares)을 의미하며, 이는 표본분산과 실제 연구 간 분산(true variance)을 모두 포함하는 총분산(total variance)을 의미하며, 다음과 같이 정의한다.

\[ Q=\sum_{i=1}^K w_ig_i^2 - \frac{(\sum_{i=1}^K w_ig_i)^2}{\sum_{i=1}^Kw_i} \]

\(Q\) 통계량은 효과크기의 동질성(homogeneity)을 검정하는데 사용되지만, 귀무가설을 검정할 뿐이며, 그 분포자체는 \(\chi^2\) 분포를 따르기 때문에 자유도(\(df\)), 즉 메타분석에 포함된 연구 수(\(K\))에 많은 영향을 받게 된다.

한편, \(df\)(자유도)는 각 연구의 모집단의 효과크기가 모두 동일하다고 가정할 때 기대하는 기대분산 값이다. 따라서 총분산-기대분산=실제분산 이므로 \(Q-df\)는 실제 연구 간 효과 차이로 인한 분산의 정도를 의미한다. 하지만 이 값은 총분산에서 기대분산을 제외한 값으로 절대값을 나타내는 것은 아니다. 따라서 비교가능성을 위해 표준화한 형태인 \(\tau^2\)을 정의한다. 일반적으로 \(\tau^2\)이 0보다 크면 연구 간 이질성이 존재하게 되며 0(또는 <0)인 경우에는 연구간 이질성이 없기때문에 고정효과모형과 랜덤효과모형의 결과가 동일하게 나타난다.

효과크기의 이질성을 나타내는 다른 지수로는 Higgin’s & Thompson’s \(I^2\)이 있으며 정의는 다음과 같다.

\[ I^2=max(0, \frac{Q-df}{Q}\times 100\%) \]

이는 총분산에 대한 실제분산의 비율을 나타내며, \(\tau^2\)과 달리 절대값이 아니라 비율(\(\%\))로 나타난다. 즉, 총분산 대비 실제 연구 간 분산의 비율을 표현한다. 일반적으로 \(I^2\)\(25\%\) 내외이면 이질성이 작은 것으로 해석하며, \(50\%\)이면 중간 크기 정도로, 그리고 \(70\%\) 이상이면 이질성이 매우 큰 것으로 해석하게 된다. 따라서 \(I^2>50\%\)이면 연구 간 이질성이 존재 할 가능성이 크다고 볼 수 있다.


3.3 연속형 자료 예제

3.3.1 Example

  • Crucial laboratory parameters in COVID-19 diagnosis and prognosis: An updated meta-analysis (Soraya and Ulhaq, 2020)


R 실습을 위해 “Crucial laboratory parameters in COVID-19 diagnosis and prognosis: An updated meta-analysis (Soraya and Ulhaq, 2020)” 논문에 명시된 자료를 이용하고 R-package meta를 사용한다.

우선 R-package meta를 install하고 R에서 사용가능하게 meta package를 loading 한다.

# install.packages("meta")
library(meta)
## Loading 'meta' package (version 4.18-1).
## Type 'help(meta)' for a brief overview.


3.3.1.1 자료의 입력

heteroc <- read.table(text='
Study   m1  s1  n1  m2  s2  n2
"Cao et al(1)"  4.48    2.22    19  4.7 1.55    174
"Cao et al(2)"  11.85   5.35    21  6.57    4.98    107
"Gao et al" 4.26    1.85    15  4.96    1.85    28
"Guan et al"    3.7 2.37    173 4.9 1.62    926
"Huang et al"   11.3    4.67    13  5.7 3.33    28
"Li et al"  5.5 2.67    25  5.27    1.55    58
"Liu et al(1)"  5.7 5.33    7   5.2 2.59    44
"Liu et al(2)"  6.08    2.56    11  5.18    1.63    67
"Lo et al"  5.57    1.99    4   4.51    1.18    6
"Mao et al" 5.4 15.03   88  4.5 9.03    126
"Qian et al"    5.23    1.52    9   4.97    1.2 82
"Qin et al" 5.6 303 286 4.9 1.77    166
"Ruan et al"    10.52   4.76    68  6.76    3.49    82
"Song et al"    6.6 5.25    42  4.2 1.85    31
"Wang et al(1)" 4.8 7.18    37  4.6 10.66   205
"Wang et al(2)" 6.6 4.59    36  4.3 1.55    102
"Yang et al"    0.62    0.37    32  0.74    0.4 20
"Young et al"   3.4 2.37    6   4.6 3.41    12
"Yudong et al"  5.53    3.34    16  5.78    2.76    96
"Zhang et al(1)"    5.3 3.7 56  4.5 1.78    82
"Zhang et al(2)"    6.2 3.92    55  4.1 2   166
"Zhang et al(3)"    6.21    3.22    3   4.28    0.82    9
"Zhou et al"    9.8 5.18    54  5.2 2.51    137
"Zhu et al" 7.8 4.13    43  6.4 2.92    71
', header=T)

heteroc
##             Study    m1     s1  n1   m2    s2  n2
## 1    Cao et al(1)  4.48   2.22  19 4.70  1.55 174
## 2    Cao et al(2) 11.85   5.35  21 6.57  4.98 107
## 3       Gao et al  4.26   1.85  15 4.96  1.85  28
## 4      Guan et al  3.70   2.37 173 4.90  1.62 926
## 5     Huang et al 11.30   4.67  13 5.70  3.33  28
## 6        Li et al  5.50   2.67  25 5.27  1.55  58
## 7    Liu et al(1)  5.70   5.33   7 5.20  2.59  44
## 8    Liu et al(2)  6.08   2.56  11 5.18  1.63  67
## 9        Lo et al  5.57   1.99   4 4.51  1.18   6
## 10      Mao et al  5.40  15.03  88 4.50  9.03 126
## 11     Qian et al  5.23   1.52   9 4.97  1.20  82
## 12      Qin et al  5.60 303.00 286 4.90  1.77 166
## 13     Ruan et al 10.52   4.76  68 6.76  3.49  82
## 14     Song et al  6.60   5.25  42 4.20  1.85  31
## 15  Wang et al(1)  4.80   7.18  37 4.60 10.66 205
## 16  Wang et al(2)  6.60   4.59  36 4.30  1.55 102
## 17     Yang et al  0.62   0.37  32 0.74  0.40  20
## 18    Young et al  3.40   2.37   6 4.60  3.41  12
## 19   Yudong et al  5.53   3.34  16 5.78  2.76  96
## 20 Zhang et al(1)  5.30   3.70  56 4.50  1.78  82
## 21 Zhang et al(2)  6.20   3.92  55 4.10  2.00 166
## 22 Zhang et al(3)  6.21   3.22   3 4.28  0.82   9
## 23     Zhou et al  9.80   5.18  54 5.20  2.51 137
## 24      Zhu et al  7.80   4.13  43 6.40  2.92  71


3.3.1.2 자료의 분석

고정효과모형 또는 랜덤효과모형으로 평균효과차이를 구하기 위해서 metacont 함수를 이용한다. metacont 함수는 두 방법의 결과를 동시에 제공 가능하기 때문에 어떤 방법을 사용할지 고민할 필요가 없다. 여기서 효과크기는 standardized mean difference (SMD)로 설정하고 교정된 평균효과크기를 위해 “Hedges” 옵션을 사용한다. 이때 사용되는 자료 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 등 이다.

fit <- metacont(n1, m1, s1, n2, m2, s2, data=heteroc,
                  studlab=paste(Study),
                  comb.fixed = TRUE,
                  comb.random = TRUE,
                  prediction = TRUE,
                  sm="SMD",
                          method.smd="Hedges") 
fit
##                    SMD             95%-CI %W(fixed) %W(random)
## Cao et al(1)   -0.1349 [-0.6086;  0.3389]       2.6        4.4
## Cao et al(2)    1.0413 [ 0.5559;  1.5267]       2.5        4.4
## Gao et al      -0.3714 [-1.0039;  0.2611]       1.5        4.0
## Guan et al     -0.6818 [-0.8466; -0.5170]      21.4        5.0
## Huang et al     1.4478 [ 0.7121;  2.1836]       1.1        3.7
## Li et al        0.1168 [-0.3524;  0.5861]       2.6        4.4
## Liu et al(1)    0.1609 [-0.6373;  0.9591]       0.9        3.5
## Liu et al(2)    0.5005 [-0.1422;  1.1432]       1.4        3.9
## Lo et al        0.6239 [-0.6891;  1.9368]       0.3        2.3
## Mao et al       0.0756 [-0.1968;  0.3480]       7.8        4.9
## Qian et al      0.2092 [-0.4797;  0.8982]       1.2        3.8
## Qin et al       0.0029 [-0.1883;  0.1941]      15.9        5.0
## Ruan et al      0.9094 [ 0.5714;  1.2473]       5.1        4.7
## Song et al      0.5699 [ 0.0961;  1.0436]       2.6        4.4
## Wang et al(1)   0.0195 [-0.3306;  0.3696]       4.7        4.7
## Wang et al(2)   0.8521 [ 0.4587;  1.2455]       3.8        4.6
## Yang et al     -0.3097 [-0.8718;  0.2524]       1.8        4.2
## Young et al    -0.3660 [-1.3553;  0.6233]       0.6        3.0
## Yudong et al   -0.0872 [-0.6166;  0.4421]       2.1        4.3
## Zhang et al(1)  0.2920 [-0.0496;  0.6336]       5.0        4.7
## Zhang et al(2)  0.8024 [ 0.4883;  1.1165]       5.9        4.8
## Zhang et al(3)  1.1024 [-0.3107;  2.5155]       0.3        2.1
## Zhou et al      1.3195 [ 0.9773;  1.6616]       5.0        4.7
## Zhu et al       0.4061 [ 0.0236;  0.7886]       4.0        4.6
## 
## Number of studies combined: k = 24
## 
##                         SMD            95%-CI    z p-value
## Fixed effect model   0.1401 [ 0.0638; 0.2163] 3.60  0.0003
## Random effects model 0.3371 [ 0.0720; 0.6023] 2.49  0.0127
## Prediction interval         [-0.9337; 1.6080]             
## 
## Quantifying heterogeneity:
##  tau^2 = 0.3572 [0.1447; 0.6542]; tau = 0.5977 [0.3804; 0.8088]
##  I^2 = 90.3% [86.8%; 92.8%]; H = 3.20 [2.75; 3.73]
## 
## Test of heterogeneity:
##       Q d.f.  p-value
##  236.06   23 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
## - Hedges' g (bias corrected standardised mean difference)

메타분석 결과는 다음과 같은 결과를 포함하고 있다.

  • the individual effect sizes for each study, and their weight
  • The total number of included studies (k)
  • The overall effect (in our case, \(g=0.1401\) for mixed model and \(g=0.3371\) for random effect model) and its confidence interval and \(p-value\)
  • Measures of between-study heterogeneity, such as \(\tau^2\) or \(I^2\) and a \(Q\)-test of heterogeneity
    • \(\tau^2=0.3572\)
    • \(I^2=90.3\% (86.8\%, 92.8\%)\)
    • \(Q=236.06\,\, (p-value=<0.0001)\)


  • 고정효과모형 결과만 산출하고 싶으면 comb.random = FALSE로 두고 반대로 랜덤효과모형 결과만 산출하고 싶으면 comb.fixed = FALSE로 설정한다.

  • 효과크기 설정시 평균차는 sm=“MD”, 표준화 평균차는 sm=“SMD”, 평균비(ratio of means)는 sm=“ROM”으로 설정한다.

  • 표준화 평균차를 보정할때는 기본적으로 method.smd=“Hedges”로 설정되어 있고 Cohen’s d는 method.smd=“Cohen”, Glass’ delta 방법은 method.smd=“Glass”로 설정한다.


3.3.1.3 Forest plot

메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다.

forest(fit)

위의 결과는 논문(Soraya and Ulhaq, 2020)에 수록된 결과와 동일함을 알 수 있다.


3.4 이산형 자료 예제

3.4.1 Example

  • Multifocal versus monofocal intraocular lenses for age-related cataract patients: a system review and meta-analysis based on randomized controlled trals (Cao et al., 2019) Figure 12.


3.4.1.1 자료의 입력

heterob <- read.table(text='
study e1 n1 e2 n2
Kamlesh(2001)   9   20  6   20
Chen(2004)  9   104 5   104
Cillino(2008)   7   47  1   15
Harman(2008)    18  24  7   19
Maxwell(2007)   7   153 3   160
', header=T)

heterob
##           study e1  n1 e2  n2
## 1 Kamlesh(2001)  9  20  6  20
## 2    Chen(2004)  9 104  5 104
## 3 Cillino(2008)  7  47  1  15
## 4  Harman(2008) 18  24  7  19
## 5 Maxwell(2007)  7 153  3 160


3.4.1.2 자료의 분석

이산형 자료를 이용한 고정효과모형 또는 랜덤효과모형으로 통합효과크기를 구하기 위해서 metabin 함수를 이용한다. 여기서 효과크기는 RR로 선택하고 가중값 계산 방법은 MH방법으로 둔다. 이때 필요한 자료의 형태는 각집단의 표본크기 (n1, n2) 그리고 발생한 이벤트 수(e1, e2)이다.

fit2<- metabin(e1,n1,e2,n2,
                 data = heterob,
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = TRUE,
                 prediction = TRUE,
                 sm = "RR",
                 method="MH")
fit2
##                   RR            95%-CI %W(fixed) %W(random)
## Kamlesh(2001) 1.5000 [0.6564;  3.4276]      25.8       25.8
## Chen(2004)    1.8000 [0.6243;  5.1897]      21.5       15.7
## Cillino(2008) 2.2340 [0.2984; 16.7245]       6.5        4.4
## Harman(2008)  2.0357 [1.0816;  3.8315]      33.6       44.1
## Maxwell(2007) 2.4401 [0.6426;  9.2651]      12.6        9.9
## 
## Number of studies combined: k = 5
## 
##                          RR           95%-CI    z p-value
## Fixed effect model   1.9108 [1.2374; 2.9506] 2.92  0.0035
## Random effects model 1.8862 [1.2391; 2.8711] 2.96  0.0031
## Prediction interval         [0.9535; 3.7313]             
## 
## Quantifying heterogeneity:
##  tau^2 = 0; tau = 0; I^2 = 0.0% [0.0%; 79.2%]; H = 1.00 [1.00; 2.19]
## 
## Test of heterogeneity:
##     Q d.f. p-value
##  0.53    4  0.9703
## 
## Details on meta-analytical method:
## - Mantel-Haenszel method
## - DerSimonian-Laird estimator for tau^2
## - Mantel-Haenszel estimator used in calculation of Q and tau^2 (like RevMan 5)

메타분석 결과는 다음과 같은 결과를 포함하고 있다.

  • the individual effect sizes for each study, and their weight
  • The total number of included studies (k)
  • The overall effect (in our case,,,, \(RR=1.91\) for mixed model and ,,, \(RR=1.89\) for random effect model) and its confidence interval and p-value
  • Measures of between-study heterogeneity, such as \(\tau^2\) or \(I^2\) and a \(Q\)-test of heterogeneity
    • \(\tau^2=0\)
    • \(I^2=0\%\)
    • \(Q=0.53\,\, (p-value=0.9703)\)


  • 고정효과모형 결과만 산출하고 싶으면 comb.random = FALSE로 두고 반대로 랜덤효과모형 결과만 산출하고 싶으면 comb.fixed = FALSE로 설정한다.

  • 효과크기 설정시 상대위험률(RR)는 sm=“RR”, 오즈비(OR)는 sm=“OR”, 비율차(RD)는 sm=“RD”, Arcsine difference는 sm=“ASD”, Diagnostic 오즈비는 sm=“DOR”로 설정한다.

  • 가중값 산출을 위한 방법으로 method 옵션을 적용하며, method.smd=“Inverse”는 역분산법, MH는 method.smd=“MH”, Peto 방법은 method.smd=“Peto”로 설정한다. 이외에도 method.smd=“GLMM”method.smd=“SSW” 방법을 설정 가능하다.


3.4.1.3 Forest plot

메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다. 이때 layout 옵션을 통해 출력양식을 조절할 수 있다. Review Manager (RevMan) 형태로 출력을 원하면 layout=“RevMan5”로 JAMA 스타일을 원하면 layout=“JAMA” 옵션으로 조절한다.

forest(fit2)

위의 결과는 논문(Cao et al., 2019)에 수록된 Figure 12와 동일함을 알 수 있다.

효과크기의 형태를 Odds ratio로 하고 싶으면 sm=“OR”로 설정하고, MH 방법이 아닌 역분산법을 이용하고 싶으면 method=“Inverse”로 설정한다.

fitor<- metabin(e1,n1,e2,n2,
                 data = heterob,
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = TRUE,
                 prediction = TRUE,
                 sm = "OR",
                 method="Inverse")
fitor
##                   OR            95%-CI %W(fixed) %W(random)
## Kamlesh(2001) 1.9091 [0.5202;  7.0069]      21.9       21.9
## Chen(2004)    1.8758 [0.6066;  5.8003]      29.1       29.1
## Cillino(2008) 2.4500 [0.2764; 21.7146]       7.8        7.8
## Harman(2008)  5.1429 [1.3842; 19.1073]      21.5       21.5
## Maxwell(2007) 2.5091 [0.6369;  9.8857]      19.7       19.7
## 
## Number of studies combined: k = 5
## 
##                          OR           95%-CI    z p-value
## Fixed effect model   2.5294 [1.3761; 4.6492] 2.99  0.0028
## Random effects model 2.5294 [1.3761; 4.6492] 2.99  0.0028
## Prediction interval         [0.9414; 6.7963]             
## 
## Quantifying heterogeneity:
##  tau^2 = 0 [0.0000; 0.9771]; tau = 0 [0.0000; 0.9885]
##  I^2 = 0.0% [0.0%; 79.2%]; H = 1.00 [1.00; 2.19]
## 
## Test of heterogeneity:
##     Q d.f. p-value
##  1.57    4  0.8136
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau

Forest plot에서 layout 옵션을 통해 출력양식을 조절할 수 있다. Review Manager (RevMan) 형태로 출력을 원하면 layout=“RevMan5” 옵션으로 조절한다.

forest(fitor, layout="RevMan5")


3.5 Time to event 예제

3.5.1 Example

  • A meta-analysis of adjusted hazard ratios from 20 observational studies of bilateral versus single internal thoracic artery coronary artery bypass grafting (Takagi et al., 2014)


3.5.1.1 자료의 입력

heteroh <- read.table(text='
study loghr se_loghr
APPROACH(2011)  -0.1424 0.1166
Bonacchi(2006)  -0.4055 0.6551
Buxton(1998)    -0.3415 0.1256
Carrier_p(2009) -0.0781 0.162
Carrier_n(2009) -0.4368 0.1197
DiMauro(2005)   -0.5306 0.2349
Endo(2001)  -0.0502 0.1787
Glineur(2012)   -0.298  0.1259
Grau(2012)  -0.3955 0.1126
Joo(2012)   -0.0125 0.2648
Kelly(2012) -0.2008 0.1004
Kinoshita(2012) -0.5906 0.2962
Kurlansky(2010) -0.1778 0.0426
Locker_only(2012)   -0.2247 0.1904
Locker_RA(2012) -0.1434 0.2412
Locker_SV(2012) -0.312  0.1276
Lytle(2004) -0.2739 0.0704
Navia(2013) -0.0194 0.343
Parsa(2013) -0.0547 0.067
Pick(1997)  -0.2002 0.2489
Puskas(2012)    -0.4309 0.1546
Stevens(2004)   -0.3081 0.1034
Toumpoulis(2006)    -0.12   0.1281
', header=T)

heteroh
##                study   loghr se_loghr
## 1     APPROACH(2011) -0.1424   0.1166
## 2     Bonacchi(2006) -0.4055   0.6551
## 3       Buxton(1998) -0.3415   0.1256
## 4    Carrier_p(2009) -0.0781   0.1620
## 5    Carrier_n(2009) -0.4368   0.1197
## 6      DiMauro(2005) -0.5306   0.2349
## 7         Endo(2001) -0.0502   0.1787
## 8      Glineur(2012) -0.2980   0.1259
## 9         Grau(2012) -0.3955   0.1126
## 10         Joo(2012) -0.0125   0.2648
## 11       Kelly(2012) -0.2008   0.1004
## 12   Kinoshita(2012) -0.5906   0.2962
## 13   Kurlansky(2010) -0.1778   0.0426
## 14 Locker_only(2012) -0.2247   0.1904
## 15   Locker_RA(2012) -0.1434   0.2412
## 16   Locker_SV(2012) -0.3120   0.1276
## 17       Lytle(2004) -0.2739   0.0704
## 18       Navia(2013) -0.0194   0.3430
## 19       Parsa(2013) -0.0547   0.0670
## 20        Pick(1997) -0.2002   0.2489
## 21      Puskas(2012) -0.4309   0.1546
## 22     Stevens(2004) -0.3081   0.1034
## 23  Toumpoulis(2006) -0.1200   0.1281


3.5.1.2 자료의 분석

본 연구에서는 Log(HR)과 SE(log(HR)) 값이 주어 졌을때, 메타분석을 위해 metagen 함수를 이용한다. metagen 함수는 effect size와 SE 값이 주어진 경우 메타분석을 시행하게 해준다. 따라서 Hazard ratio 뿐만 아니라 연속형자료와 비율형 자료 모두 사용 가능하다. 이때 효과크기 유형은 sm 옵션에서 조절하며, “RD”, “RR”, “OR”, “ASD”, “HR”, “MD”, “SMD”, “ROM” 등이 가능하다.

fit3<- metagen(loghr,se_loghr,
                 data = heteroh,
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = FALSE,
                 prediction = TRUE,
                 sm = "HR")
fit3
##                       HR           95%-CI %W(fixed)
## APPROACH(2011)    0.8673 [0.6901; 1.0899]       3.9
## Bonacchi(2006)    0.6666 [0.1846; 2.4072]       0.1
## Buxton(1998)      0.7107 [0.5556; 0.9091]       3.4
## Carrier_p(2009)   0.9249 [0.6733; 1.2705]       2.0
## Carrier_n(2009)   0.6461 [0.5110; 0.8169]       3.7
## DiMauro(2005)     0.5883 [0.3712; 0.9322]       1.0
## Endo(2001)        0.9510 [0.6700; 1.3499]       1.7
## Glineur(2012)     0.7423 [0.5800; 0.9501]       3.4
## Grau(2012)        0.6733 [0.5400; 0.8396]       4.2
## Joo(2012)         0.9876 [0.5877; 1.6595]       0.8
## Kelly(2012)       0.8181 [0.6719; 0.9960]       5.3
## Kinoshita(2012)   0.5540 [0.3100; 0.9900]       0.6
## Kurlansky(2010)   0.8371 [0.7701; 0.9100]      29.5
## Locker_only(2012) 0.7988 [0.5500; 1.1601]       1.5
## Locker_RA(2012)   0.8664 [0.5400; 1.3901]       0.9
## Locker_SV(2012)   0.7320 [0.5700; 0.9400]       3.3
## Lytle(2004)       0.7604 [0.6624; 0.8729]      10.8
## Navia(2013)       0.9808 [0.5007; 1.9210]       0.5
## Parsa(2013)       0.9468 [0.8303; 1.0796]      11.9
## Pick(1997)        0.8186 [0.5026; 1.3333]       0.9
## Puskas(2012)      0.6499 [0.4800; 0.8800]       2.2
## Stevens(2004)     0.7348 [0.6000; 0.8999]       5.0
## Toumpoulis(2006)  0.8869 [0.6900; 1.1400]       3.3
## 
## Number of studies combined: k = 23
## 
##                         HR           95%-CI     z  p-value
## Fixed effect model  0.8048 [0.7691; 0.8421] -9.38 < 0.0001
## Prediction interval        [0.7174; 0.8858]               
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0018 [0.0000; 0.0166]; tau = 0.0429 [0.0000; 0.1289]
##  I^2 = 12.0% [0.0%; 45.9%]; H = 1.07 [1.00; 1.36]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  24.99   22  0.2974
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau

메타분석 결과는 다음과 같은 결과를 포함하고 있다.

  • the individual effect sizes for each study, and their weight
  • The total number of included studies (k)
  • The overall effect (in our case,,,, \(HR=0.805\) for mixed model) and its confidence interval and p-value
  • Measures of between-study heterogeneity, such as \(\tau^2\) or \(I^2\) and a \(Q\)-test of heterogeneity
    • \(\tau^2=0.0018\)
    • \(I^2=12.0\% (0.0%, 45.9\%)\)
    • \(Q=24.99\,\, (p-value=0.2974)\)


3.5.1.3 Forest plot

메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다.

forest(fit3,layout = "RevMan5")

위의 결과는 논문(Takagi et al., 2014)에 수록된 Figure 1과 동일함을 알 수 있다.

Forest plot에서 layout 옵션을 “JAMA”로 두면 “Journal of the American Medical Association (JAMA)” 에서 추천하는 형태로 출력이 된다.

forest(fit3,layout = "JAMA")

<! —— Chapter 4. 조절효과분석 ————————->

4 조절효과분석

4.1 조절효과분석의 의미

효과크기분석 결과 각 연구 간 효과크기의 이질성(heterogeneity)이 상당한 수준으로 나타난 경우에는 그 이질성의 배경이나 원인에 대한 추가적인 설명이 필요하며, 이를 위해 조절효과분석이 필요하다. 즉, 조절효과분석은 효과크기의 차이를 설명해줄 수 있는 연구수준의 변수, 즉 조절변수를 고려하여 효과크기의 이질성을 설명한다.

메타분석에서 조절효과분석은 하위집단(subgroup) 간의 효과크기 차이를 보다 직접적으로 검증할 수 있게 하며, 평균효과크기에 영향을 주는 변수, 즉 조절변수의 영향력을 검증할 수 있게 한다. 또한 평균효과크기에 영향을 주는 변수, 즉 조절변수의 영향력을 검증할 수 있도록 한다. 조절변수(covariate or moderators)는 일반적으로 독립변수와 종속변수의 관계에 영향을 주는 변수로서, 메타분석에서는 연구 수준(study-level)의 변수를 말한다. 예를 들어, 연구대상자들에 대한 그룹화 방식(무작위배정 또는 비무작위배정), 프로그램의 기간, 출간 형태(학술지 논문 여부) 등이 조절변수가 된다.

조절효과분석은 효과크기의 이질성을 설명하는 연구 차원(study-level)의 변수, 즉 조절변수를 통해 수행된다. 분석 방법으로는 일반적으로 1) 조절변수가 범주형 변수일 경우 메타 ANOVA; 2) 조절변수가 연속형 변수일 경우 메타회귀분석(meta-regression)이 있다. 이 두가지 방법은 메타분석이 아닌 일차적인 연구에서 활용되는 분산분석(ANOVA)이나 OLS(ordinary least square) 회귀분석과는 다르다. 즉 데이터의 모든 분산을 설명하는 것이 아니라 실제분산(연구 간 분산)을 설명하고자 하는 것이다. 그리고 메타회귀분석의 경우 조절변수당 최소 10개의 연구가 필요하다(Higgins & Green, 2011).

조절효과분석은 비실험적(nonexperimental 또는 observational) 분석으로써 인과관계(causal relationship)를 유추할 수 있는 것은 아니며, 일반적으로 효과크기의 차이 및 그 이질성에 대한 원인, 배경 등에 대한 가설을 만들어내는(generating hypothesis) 역할을 한다. 즉 조절효과분석의 목적은 효과크기의 이질성에 관하여 있을 법한 원인(possible causes for heterogeneity)에 대한 탐색적 설명을 하는 데 있다.


4.2 하위그룹 분석

효과 크기 추정을 덜 정확하게 만드는 연구 간 이질성의 또 다른 원인은 연구 간 연구 설계 차이 또는 중재 요소의 차이 등이 있다. 예를 들어, 대학생의 우울증에 대한 인지 행동 치료(CBT)의 효과에 대한 메타 분석에서 일부 연구는 그룹 환경에서 중재를 제공하고 다른 연구는 각 학생에게 개별적으로 치료를 제공 한 경우를 들 수 있다. 같은 예에서, 각 연구 내에서 학생이 우울증을 앓고 있는지 확인하기 위해 다른 기준을 사용한 경우를 들 수 있다 (예 : 진단 인터뷰 또는 자가보고 설문지 사용).

이러한 종류의 연구 간 차이점이 존재할 수 있으며, 연구 간 차이점이 전체 효과크기를 결정하는데 영향을 줄 수도 있기 때문에 하위 그룹 분석을 통해 메타분석 연구 내에서 하위그룹간 차이를 살펴보고 그 효과가 다르게 나타나는지 확인해야 한다.`

하위그룹 분석의 개념을 좀 더 살펴보면, 모든 하위그룹 분석은 (1) 각 하위그룹의 효과를 통합하고 (2) 하위그룹의 효과를 비교하는 두 부분으로 구성된다(Borenstein and Higgins 2013).


4.2.0.1 하위그룹 내 효과 통합

각 하위그룹의 효과 통합은 하위 그룹 내에서 단순 메타분석과 동일한 기준이 적용되기 때문에 간단히 확인 가능하다.

  • 하위급룹 내의 모든 연구가 동일한 모집단에서 비롯되고 모두 하나의 실제(true) 효과를 공유한다고 가정할 수 있다면 고정효과 모형을 사용할 수 있다.
  • 많은 경우 이러한 가정 자체에 의문을 품을 수 있기 때문에 대안으로 하위그룹 내의 연구가 서로 다른 효과를 가진 모집단에서 추출되었다고 가정하는 랜덤효과모형을 사용할 수 있다.


4.2.0.2 하위 그룹간 효과 비교

각 하위그룹에 대한 합동 효과를 계산한 후 하위그룹간 효과 크기를 비교할 수 있다. 그러나 이 차이가 실제로 중요하거나 의미가 있는지 확인하려면 하위그룹간 효과 크기 차이에 대한 \(SE_{diff}\), 즉 차이에 대한 표준오차를 계산하고 이를 통해 신뢰 구간 산출 및 유의성 검정을 수행해야 한다. 표준오차를 계산하는 방법에는 크게 두 가지가 있으며 서로 다른 가정을 기반으로 한다.

  • 고정효과모형 : 하위그룹의 구성을 임의적으로 할 수 없는 경우, 하위그룹 간 비교는 고정효과 모형을 사용한다(Borenstein and Higgins 2013). 즉, 살펴보고자 하는 하위그룹이 무작위로 “선택된” 혹은 선택되어 지는 것이 아니라 하위그룹의 특성이 고정된 수준을 나타내는 경우를 의미한다. 예를 들어, 성별은 여성과 남성의 두 하위그룹이 무작위로 선택되지 않고 특성이 고정된 두 하위 그룹으로 표현된다. 또 다른 예로 임상적 우울증 환자와 준임상적 우울증 환자가 서로 다른 효과를 보이는지 조사하는 연구를 들 수 있다. 따라서 하위그룹 자체가 고정된 형태를 보이기 때문에 하위그룹 간 표본오차는 존재하지 않으며, 그렇기 때문에 \(SE_{diff}\)는 각 하위그룹 내에서만 영향을 받는다. 각 하위그룹의 분산을 \(V_A\)\(V_B\)라 하면 차이에 대한 분산은 다음과 같다.

\[ V_{diff}=V_a +V_B \]

하위그룹간 차이 검정을 위한 고정효과 모형은 하위그룹 내에서 랜덤효과 모형을 통합효과크기를 추정한 경우에도 사용가능하다. 이러한 모형을 혼합효과(mixed-effects) 모형이라 한다.

  • 랜덤효과모형: 하위그룹 간 차이 검정을 위한 랜덤효과모형은 하위그룹을 랜덤하게 구성 가능한 경우 주로 사용한다. 예를 들어, 서로 다른 5개의 지역에서 나타나는 중재효과에 관심있는 연구를 생각해보자. 이와 같은 경우 지역, “region”은 여러 지역중에서 랜덤하게 5개의 지역을 선택하면 하위그룹을 나누는 값 자체가 랜덤하게 바뀌게 되며, 이로인해 새로운 표본오차가 발생하게 된다. 따라서 이러한 표본오차를 조절하기 위해 랜덤효과모형을 사용한다. 랜덤효과모형에서 차이에 대한 분산은 다음과 같다.

\[ V_{diff}=V_A + V_B +\frac{T^2}{m} \] 여기서 \(T^2\)은 하위그룹간 분산이고 \(m\)은 하위그룹의 수이다.

하위그룹 분석은 항상 정보에 입각하여 사전에 결정되어야 한다. 실질적으로 연구 내에서 하위그룹간 차이가 있을 수 있어야 하며, 관련 연구 질문에 대한 정보 획득으로 이어져야한다. 따라서 분석을 수행하기 전에 하위그룹간 분석을 위한 변수를 지정하고 분석 계획에 기재하는 것도 좋은 방법이다.

하위그룹간 분석은 종종 연구자체에 제한을 받을 수 있다. 하위그룹 분석에도 충분한 검정력이 확보되어야 하기 때문에 메타분석의 전체 연구 수가 \(k<10\)인 경우에는 두 그룹 이상의 하위그룹을 비교하는 것은 의미가 없다(Higgins and Thompson, 2004).


4.2.1 Example

  • Multifocal versus monofocal intraocular lenses for age-related cataract patients: a system review and meta-analysis based on randomized controlled trials (Cao et al., 2019) Figure 7 예제


4.2.1.1 자료의 입력

multi <- read.table(text='
study n1 m1 s1 n2 m2 s2 distance
"Leyand MD 2002"    29  0.01    0.08    16  -0.01   0.11    4m
"NijKamp MD 2004"   68  0.02    0.1 69  0.03    0.1 4m
"Peng C 2012"   50  -0.02   0.06    51  -0.04   0.08    4m
"Ye PP 2010"    50  0.02    0.06    50  0.01    0.04    5m
"Harman FE 2008"    19  0   0.09    24  -0.1    0.09    unclear
"Rasp M 2012"   113 0.27    0.2 28  0.28    0.19    unclear
"Puell MC 2015" 21  0.12    0.09    18  0   0.06    unclear
', header=T)

multi
##             study  n1    m1   s1 n2    m2   s2 distance
## 1  Leyand MD 2002  29  0.01 0.08 16 -0.01 0.11       4m
## 2 NijKamp MD 2004  68  0.02 0.10 69  0.03 0.10       4m
## 3     Peng C 2012  50 -0.02 0.06 51 -0.04 0.08       4m
## 4      Ye PP 2010  50  0.02 0.06 50  0.01 0.04       5m
## 5  Harman FE 2008  19  0.00 0.09 24 -0.10 0.09  unclear
## 6     Rasp M 2012 113  0.27 0.20 28  0.28 0.19  unclear
## 7   Puell MC 2015  21  0.12 0.09 18  0.00 0.06  unclear


4.2.1.2 자료의 분석

하위그룹 분석은 metacont 함수에서 “byvar” 옵션으로 설정한다. 여기서 효과크기는 mean difference (MD)로 설정하고 교정된 평균효과크기를 위해 “Hedges” 옵션을 사용한다.

fit <- metacont(n1, m1, s1, n2, m2, s2, data=multi,
                  studlab=paste(study),
                  comb.fixed = TRUE,
                  comb.random = TRUE,
                  prediction = TRUE,
                  sm="MD")
fit
##                      MD            95%-CI %W(fixed) %W(random)
## Leyand MD 2002   0.0200 [-0.0413; 0.0813]       4.5       11.7
## NijKamp MD 2004 -0.0100 [-0.0435; 0.0235]      15.1       16.4
## Peng C 2012      0.0200 [-0.0075; 0.0475]      22.3       17.4
## Ye PP 2010       0.0100 [-0.0100; 0.0300]      42.3       18.4
## Harman FE 2008   0.1000 [ 0.0458; 0.1542]       5.8       12.9
## Rasp M 2012     -0.0100 [-0.0895; 0.0695]       2.7        9.2
## Puell MC 2015    0.1200 [ 0.0726; 0.1674]       7.5       14.0
## 
## Number of studies combined: k = 7
## 
##                          MD            95%-CI    z p-value
## Fixed effect model   0.0226 [ 0.0096; 0.0356] 3.40  0.0007
## Random effects model 0.0348 [ 0.0019; 0.0677] 2.07  0.0382
## Prediction interval         [-0.0714; 0.1409]             
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0014 [0.0004; 0.0115]; tau = 0.0377 [0.0211; 0.1070]
##  I^2 = 79.9% [59.1%; 90.2%]; H = 2.23 [1.56; 3.19]
## 
## Test of heterogeneity:
##      Q d.f.  p-value
##  29.89    6 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
forest(fit)

fit_sub <- metacont(n1, m1, s1, n2, m2, s2, data=multi,
                  studlab=paste(study),
                  comb.fixed = TRUE,
                  comb.random = TRUE,
                  prediction = TRUE,
                  sm="MD",
                        byvar=distance) 
fit_sub
##                      MD            95%-CI %W(fixed) %W(random) distance
## Leyand MD 2002   0.0200 [-0.0413; 0.0813]       4.5       11.7       4m
## NijKamp MD 2004 -0.0100 [-0.0435; 0.0235]      15.1       16.4       4m
## Peng C 2012      0.0200 [-0.0075; 0.0475]      22.3       17.4       4m
## Ye PP 2010       0.0100 [-0.0100; 0.0300]      42.3       18.4       5m
## Harman FE 2008   0.1000 [ 0.0458; 0.1542]       5.8       12.9  unclear
## Rasp M 2012     -0.0100 [-0.0895; 0.0695]       2.7        9.2  unclear
## Puell MC 2015    0.1200 [ 0.0726; 0.1674]       7.5       14.0  unclear
## 
## Number of studies combined: k = 7
## 
##                          MD            95%-CI    z p-value
## Fixed effect model   0.0226 [ 0.0096; 0.0356] 3.40  0.0007
## Random effects model 0.0348 [ 0.0019; 0.0677] 2.07  0.0382
## Prediction interval         [-0.0714; 0.1409]             
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0014 [0.0004; 0.0115]; tau = 0.0377 [0.0211; 0.1070]
##  I^2 = 79.9% [59.1%; 90.2%]; H = 2.23 [1.56; 3.19]
## 
## Test of heterogeneity:
##      Q d.f.  p-value
##  29.89    6 < 0.0001
## 
## Results for subgroups (fixed effect model):
##                      k     MD            95%-CI    Q   I^2
## distance = 4m        3 0.0092 [-0.0109; 0.0293] 1.97  0.0%
## distance = 5m        1 0.0100 [-0.0100; 0.0300] 0.00    --
## distance = unclear   3 0.0910 [ 0.0584; 0.1235] 7.75 74.2%
## 
## Test for subgroup differences (fixed effect model):
##                    Q d.f.  p-value
## Between groups 20.17    2 < 0.0001
## Within groups   9.72    4   0.0454
## 
## Results for subgroups (random effects model):
##                      k     MD            95%-CI  tau^2    tau
## distance = 4m        3 0.0092 [-0.0109; 0.0293]      0      0
## distance = 5m        1 0.0100 [-0.0100; 0.0300]     --     --
## distance = unclear   3 0.0769 [ 0.0099; 0.1438] 0.0026 0.0506
## 
## Test for subgroup differences (random effects model):
##                     Q d.f. p-value
## Between groups   3.71    2  0.1562
## 
## Prediction intervals for subgroups:
##                               95%-PI
## distance = 4m      [-0.1211; 0.1395]
## distance = 5m                       
## distance = unclear [-0.6989; 0.8526]
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau

메타분석 결과는 다음과 같은 결과를 포함하고 있다.

  • the individual effect sizes for each study, and their weight
  • The total number of included studies (k)
  • The overall effect (in our case, \(g=0.023\) for mixed model and \(g=0.035\) for random effect model) and its confidence interval and p-value
  • Measures of between-study heterogeneity, such as \(\tau^2\) or \(I^2\) and a \(Q\)-test of heterogeneity
    • \(\tau^2=0.0014\)
    • \(I^2=79.9\% (59.1\%, 90.2\%)\)
    • \(Q=29.89\,\, (p-value=0.0001)\)

하위그룹 분석결과를 살펴보면 랜덤효과모형에서 between group의 \(Q\) 값이 \(3.71\), \(p-value\)\(0.1562\)로 거리로 인한 차이는 없는것으로 나타난다.


4.2.1.3 Forest plot

메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다.

forest(fit_sub)

위의 결과는 논문(Cao et al., 2019)에 수록된 Figure 7와 동일함을 알 수 있다.


4.3 메타회귀분석


4.3.1 메타회귀분석 개념

메타회귀(Meta-regression)분석은 개념적으로 하위그룹분석과 크게 다르지 않다. 하위그룹 분석에서 두 그룹 이상 비교하는 것은 메타회귀에서 범주형 변수를 예후인자(predictor)로 사용하는것과 같다. 하지만 메타회귀는 예후인자로 범주형 변수 뿐만 아니라 연속형 변수도 사용가능하며 이러한 변수가 효과크기 차이에 영향을 주는지도 살펴 볼 수 있다.

일반적으로 회귀분석은 환자 단위 수준에서 수행되지만 메타분석에서는 환자 단위의 분석이 불가능하며, 통합된 효과에 대해서 수행하기 때문에 연구 수준의 예후인자가 필요하다. 이는 회귀분석을 수행할 만큼 충분한 표본을 확보하지 못할 가능성이 있음을 시사한다. 하위그룹분석에서는 최소 10개의 개별연구가 필요하며, 메타회귀 분석에서는 공변량(covariate)당 최소 10개의 연구가 필요하지만 이것이 절대적인 규칙이 될수는 없다.

일반적인 회귀분석은 공변량 \(x_j\)를 통해 반응변수 \(y_i\)에 영향을 주는 회귀계수 \(\beta_j\)의 크기를 추정하는데 관심이 있고, 이를 통한 회귀 모형은 다음과 같다.

\[ y_i=\beta_0 + \beta_1x_{1i} +\cdots + \beta_nx_{pi}+\epsilon_i \]

메타회귀에서는 예후인자에 따른 효과와 효과크기 \(\theta_k\)를 추정하는데 관심이 있고, 따라서 회귀모형은 다음과 같다.

\[ \theta_k=\theta+\beta_1x_{1k}+\cdots+\beta_nx_{nk}+\epsilon_k+\zeta_k \]

여기서 \(\epsilon_k\)는 실제(true) 효과로부터 벗어난 표본오차를 의미하며 \(\zeta_k\)는 효과크기 분포로부터 나타난 연구간 실제 효과크기를 의미한다. 두 항(term)은 독립을 가정하며, 랜덤효과모형에서 나타나는 에러항과 같은 역할을 한다. 고정효과 모형에서는 같은 효과크기를 공유하기 때문에 연구간 이질성 \(\tau^2=0\)로 나타난다. 따라서 이때는 \(\zeta_k\)를 고려하지 않는다.

위의 회귀모형은 고정효과(\(\beta\) coefficients)와 랜덤효과(\(\zeta_k\))를 모두 포함하기 때문에 메타회귀에서 사용하는 모형을 혼합효과 모형(mixed-effects model)이라고 한다. 수리적으로 이 모형은 하위그룹 분석에서 언급한 혼합효과 모형과 같다. 하위그룹 분석의 형태를 메타회귀 형태로 표현할때는 범주형 자료를 더미(dummy) 변수화해서 공변량으로 사용하면 된다. 예를 들어, \(D_k=(0, 1)\)인 경우 메타회귀 모형은 다음과 같다.

\[ \theta_k=\theta + \beta x_k + D_k \gamma +\epsilon_k +\zeta_k \]


4.3.2 Example

  • 결핵(TB) 예방을 위해 접종한 BCG 백신의 효과 연구 (Colditz et al., 1994)


4.3.2.1 자료의 입력

tb <- read.table(text='
study e1 n1 e2 n2 start latitude country allocation allo2
"Ferguson & Simes"  6   306 29  303 1933    55  "Canada"    "Random allocation" 1
"Aronson"   4   123 11  139 1935    52  "Northern USA"  "Random allocation" 1
"Rosenthal et al"   17  1716    65  1665    1941    42  "Chicago"   "alternation/systematic allocation" 0
"Comstrock & Webster"   5   2498    3   2341    1947    33  "Georgia(Sch)"  "alternation/systematic allocation" 0
"Comstock et al (a)"    186 50634   141 27338   1949    18  "Puerto Rico"   "alternation/systematic allocation" 0
"Frimont-Moller et al"  33  5069    47  5808    1950    13  "Madanapalle"   "alternation/systematic allocation" 0
"Comstock et al (b)"    27  16913   29  17854   1950    33  "Georgia (Comm)"    "alternation/systematic allocation" 0
"Hart & Sutherland" 62  13598   248 12867   1950    53  "Uk"    "Random allocation" 1
"Vandeviere et al"  8   2545    10  629 1965    18  "Haiti" "Random allocation" 1
"Coetzee & Berjak"  29  7499    45  7277    1965    27  "South Africa"  "Random allocation" 1
"TB Prevention Trial"   505 88391   499 88391   1968    13  "Madras"    "Random allocation" 1
', header=T)

tb
##                   study  e1    n1  e2    n2 start latitude        country
## 1      Ferguson & Simes   6   306  29   303  1933       55         Canada
## 2               Aronson   4   123  11   139  1935       52   Northern USA
## 3       Rosenthal et al  17  1716  65  1665  1941       42        Chicago
## 4   Comstrock & Webster   5  2498   3  2341  1947       33   Georgia(Sch)
## 5    Comstock et al (a) 186 50634 141 27338  1949       18    Puerto Rico
## 6  Frimont-Moller et al  33  5069  47  5808  1950       13    Madanapalle
## 7    Comstock et al (b)  27 16913  29 17854  1950       33 Georgia (Comm)
## 8     Hart & Sutherland  62 13598 248 12867  1950       53             Uk
## 9      Vandeviere et al   8  2545  10   629  1965       18          Haiti
## 10     Coetzee & Berjak  29  7499  45  7277  1965       27   South Africa
## 11  TB Prevention Trial 505 88391 499 88391  1968       13         Madras
##                           allocation allo2
## 1                  Random allocation     1
## 2                  Random allocation     1
## 3  alternation/systematic allocation     0
## 4  alternation/systematic allocation     0
## 5  alternation/systematic allocation     0
## 6  alternation/systematic allocation     0
## 7  alternation/systematic allocation     0
## 8                  Random allocation     1
## 9                  Random allocation     1
## 10                 Random allocation     1
## 11                 Random allocation     1


4.3.2.2 자료의 분석

기본적인 효과크기분석 결과는 다음과 같다.

reg<- metabin(e1,n1,e2,n2,
                 data = tb,
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = FALSE,
                 prediction = TRUE,
                 sm = "RR",
                 method="Inverse")
reg
##                          RR           95%-CI %W(fixed)
## Ferguson & Simes     0.2049 [0.0863; 0.4864]       1.1
## Aronson              0.4109 [0.1343; 1.2574]       0.7
## Rosenthal et al      0.2538 [0.1494; 0.4310]       3.0
## Comstrock & Webster  1.5619 [0.3737; 6.5284]       0.4
## Comstock et al (a)   0.7122 [0.5725; 0.8860]      17.4
## Frimont-Moller et al 0.8045 [0.5163; 1.2536]       4.2
## Comstock et al (b)   0.9828 [0.5821; 1.6593]       3.0
## Hart & Sutherland    0.2366 [0.1793; 0.3121]      10.8
## Vandeviere et al     0.1977 [0.0784; 0.4989]       1.0
## Coetzee & Berjak     0.6254 [0.3926; 0.9962]       3.8
## TB Prevention Trial  1.0120 [0.8946; 1.1449]      54.6
## 
## Number of studies combined: k = 11
## 
##                         RR           95%-CI     z  p-value
## Fixed effect model  0.7305 [0.6668; 0.8002] -6.75 < 0.0001
## Prediction interval        [0.1160; 2.2249]               
## 
## Quantifying heterogeneity:
##  tau^2 = 0.3818 [0.1425; 1.5389]; tau = 0.6179 [0.3774; 1.2405]
##  I^2 = 92.0% [87.7%; 94.8%]; H = 3.54 [2.86; 4.40]
## 
## Test of heterogeneity:
##       Q d.f.  p-value
##  125.63   10 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau


위의 분석 결과를 forest plot으로 제시하면 다음과 같다.

forest(reg)

결과를 살펴보면 전체 분산 중 연구 간 분산이 차지하는 비율이 \(92\%\)로 나타나 연구 간 효과크기의 이질성이 매우 크다는 것을 알 수 있다. 따라서 이러한 효과크기의 이질성을 설명하기 위한 추가적인 분석이 필요하다. 먼저 연구대상자 배정에 대한 범주형 변수인 allo2를 조절변수로 하여 메타회귀 분석을 시행하면 다음과 같다.

메타회귀 분석은 meta 패키지에서 metareg 함수로 시행한다.

metareg(reg, allo2)
## 
## Mixed-Effects Model (k = 11; tau^2 estimator: DL)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.5607 (SE = 0.4220)
## tau (square root of estimated tau^2 value):             0.7488
## I^2 (residual heterogeneity / unaccounted variability): 92.79%
## H^2 (unaccounted variability / sampling variability):   13.86
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 9) = 124.7494, p-val < .0001
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.3737, p-val = 0.2412
## 
## Model Results:
## 
##          estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt   -0.3664  0.3663  -1.0003  0.3172  -1.0843  0.3515    
## allo2     -0.5828  0.4973  -1.1720  0.2412  -1.5574  0.3918    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
bubble(metareg(reg, allo2))

메타회귀 분석 결과를 보면, allo2는 랜덤배정(allo2=1)의 경우 비랜덤배정(allo2=0)에 비해 효과크기가 0.58만큼 감소하지만 통계적으로 유의하지 않은 것으로 나타난다.(\(p-value=0.241\))

여기서 각 연구가 수행된 위도, 즉 latitude를 연속형 조절변수로 하여 메타회귀분석을 실시하면 다음과 같은 결과를 얻는다.

metareg(reg, latitude)
## 
## Mixed-Effects Model (k = 11; tau^2 estimator: DL)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0652 (SE = 0.0654)
## tau (square root of estimated tau^2 value):             0.2553
## I^2 (residual heterogeneity / unaccounted variability): 61.80%
## H^2 (unaccounted variability / sampling variability):   2.62
## R^2 (amount of heterogeneity accounted for):            82.93%
## 
## Test for Residual Heterogeneity:
## QE(df = 9) = 23.5614, p-val = 0.0051
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 17.7319, p-val < .0001
## 
## Model Results:
## 
##           estimate      se     zval    pval    ci.lb    ci.ub 
## intrcpt     0.2539  0.2333   1.0883  0.2765  -0.2034   0.7112      
## latitude   -0.0298  0.0071  -4.2109  <.0001  -0.0436  -0.0159  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

조절변수인 latitude의 회귀계수는 \(\beta=-0.0298 (p-value<.0001)\)로 유의하게 나타났으며, 조절변수에 의해 설명되는 연구 간 분산의 비율 \(R^2=82.93\%\)로 나타나 그 설명력이 매우 높다는 것을 알 수 있다. 회귀분석의 결과를 회귀선으로 나타내면 다음과 같다.

bubble(metareg(reg,latitude))

이러한 그림을 bubble plot이라 하며 meta 패키지의 bubble 함수를 이용하여 표현한다.

5 출판 비뚤림 분석

다른 연구와 마찬가지로 메타분석에서도 여러가지 비뚤림(bias)이 존재하며, 그 유형으로는 언어적 비뚤림(language bias), 접근성 비뚤림(availability bias), 친숙도 비뚤림(familiarity bias), 결과보고 비뚤림(outcome-reporting bias), 비용 비뚤림(cost bais) 등이 있다.

비뚤림 유형 내용
언어적 비뚤림 영어로 출간된 연구 결과를 선별적으로 포함시켜서 발생하는 비뚤림
접근성 비뚤림 연구자가 접근하기 쉬운 연구 결과를 선별적으로 포함시키는 비뚤림
친숙도 비뚤림 자신의 학문 분야의 연구 결과만을 선별적으로 포함시키는 비뚤림
결과보고 비뚤림 연구자가 연구 결과를 선별적으로 보고하는 경우, 즉 일반적으로 통계적으로 유의한 연구 결과는 그렇지 않은 연구 결과보다 더 잘 보고되는 경향이 있으므로 발생하는 비뚤림
비용 비뚤림 무료 또는 저비용으로 이용 가능한 연구를 선별적으로 포함하는 경우에 생기는 비뚤림
  • 연구에 포함된 연구가 전체 연구(the population of completed studies)를 대표하지 못하는 비뚤림. 즉 비대표성(unrepresentativeness)과 관련되어 있다. 따라서 이 모든 비뚤림을 보통 배포 비뚤림(dissemination bias)이라는 포괄적 용어로 지칭하기도 한다. 하지만 이와 유사한 용어로 출판 비뚤림(publication bias)이라는 용어가 이미 학계에 정착되어 있다. 한편 코크란(Cochrane)에서는 이를 보고 비뚤림(reporting bias)이라고 부르기도 한다.


5.1 출판 비뚤림의 의미

출판 비뚤림은 일반적으로 연구 결과의 속성이나 방향에 따라 연구 결과가 출판되거나 출판 되지 못하는 비뚤림을 의미한다. 하지만 메타분석에서 출판 비뚤림을 논할 때는 Copas & Shi(2000)가 언급한 출판(publication)의 의미 즉, 메타분석에 포함될 연구를 선정하는 전체 과정(the whole process of selecting a study)을 의미한다.

메타분석에 포함된 연구로부터 나타난 분석 결과가 분석에 포함되어야 할 연구들이 모두 포함되었을 때 나타나는 분석 결과와 체계적으로 다르다면 출판 비뚤림이 존재한다고 할 수 있다. 즉, 출판된 연구의 결과가 모든(수행된) 연구의 결과를 대표하지 못할 때 출판 비뚤림이 발생하는 것이다. 따라서 메타분석에 포함된 연구가 관련된 모든 연구들의 왜곡된 표본(biased sample)이라면, 그 결과(즉 메타분석의 결과로) 나타난 전체효과크기는 왜곡된 – 일반적으로 과대추정(overestimated)된 – 결과라고 할 수 있다.

문헌에는 출판된 문헌뿐만 아니라 출판되지 않은 회색문헌(grey literature)도 존재하는데 이는 기술 보고서(technical reports), 정부 보고서(governmental reports), 학위논문(thesis/dissertation), 회의자료(conference papers) 등과 같은 것이다. 만약 이러한 회색문헌이 메타분석에 포함되지 않았다면 메타분석은 표본추출 비뚤림(sampling bias)으로부터 자유로울 수 없다. 또한 긍정적인 결과를 보여주는, 그리고 통계적으로 유의미한 결과를 보여주는 연구는 그렇지 않은 연구보다 출판될 가능성이 높으므로 출판된 연구는 메타분석에 포함될 가능성이 높다. 따라서 통계적으로 유의하지 않거나 긍정적인 결과를 도출하지 못한 연구는 출판되지 않아서 메타분석에 포함되지 않을 가능성이 높으므로 이는 누락된 연구(missing studies)로 나타난다.

메타분석에 있어서 표본크기(sample size)가 작은 연구들이 상대적으로 큰 효과크기를 보이는 경향을 small-study effects라고 한다. 통계적 유의성에 상관없이 표본이 큰 연구들은 출판될 가능성이 높고, 표본이 중간 크기인 경우 출판되지 않을 가능성이 있다. 또한 표본이 작은 연구들은 출판되지 않을 가능성(missing)이 가장 높지만 효과크기가 크다면 출판될 가능성이 있다. 즉, 메타분석에 포함된 연구 중 표본크기가 작은 연구는 효과크기가 상대적으로 큰 연구일 가능성이 높다고 할 수 있다. 따라서 ‘small-study effects’에 대한 이러한 가설을 검정하기 위해 표본크기와 효과크기의 관계를 고찰할 필요가 있다. 만약 이 양자 간에 어떤 의미 있는 관계가 존재한다면 표본크기가 작은 연구로 인한 영향에 대한 가설은 사실(true)이라고 볼 수 있다. 즉, 메타분석에 포함된 연구들 중에서 표본크기가 작은 연구들의 효과크기가 상대적으로 크다면, 이것은 samll-study effects, 출판 비뚤림이 존재한다는 근거로 볼 수 있다.


5.2 출판 비뚤림의 분석 과정


출판 비뚤림에 대한 분석 과정은 다음과 같다.

  1. 데이터에 대해 검토한다.
  2. 비뚤림이 있는지 그 근거를 확인한다.
  3. 비뚤림이 미치는 영향을 고려한다.

일반적으로 출판 비뚤림에 대한 분석 목표는 다음 중 한가지로 볼 수 있다.

1. 비뚤림의 영향력(the impact of bias)이 미미하다.
2  비뚤림의 영향력이 미미하지는 않지만 결과에 영향을 줄 정도는 아니다.
3. 비뚤림이 심각해서 연구 결과가 의심스럽다.


5.2.1 자료에 대한 검토(forest plot 이용)

출판 비뚤림이 존재하는지 살펴보는 가장 좋은 출발점은 메타분석의 결과를 검토해보는 것으로, forest plot을 살펴보는 것이 좋다. Forest plot은 개별 연구 결과와 전체 결과를 동시에 보여준다. 즉 각 개별연구들의 결과(효과크기 및 통계적 유의성)와 패턴, 그리고 전체 연구 결과의 양상(평균효과크기 및 통계적 유의성)을 보여준다. 아래 Forest plot을 살펴보면 가중값이 작은 연구들 즉 표본의 크기가 작은 연구들이 대체로 효과크기가 큰 것으로 나타남을 알 수 있다. 즉 ‘small-study effects’ 가능성이 있는 것으로 볼 수 있다.


5.2.2 ‘small-study effects’ 존재 유무에 대한 확인(funnel plot 이용)

메타분석에서 표본의 크기와 효과크기의 관계를 보여주기 위해 funnel plot을 이용한다. 깔대기 모양을 하고 있다고 해서 funnel plot이라 부르며, 수평축에는 효과크기, 수직축에는 표준오차(standard error)로 구성된다. 일반적으로 표본이 큰 연구들은 그래프의 상단에 위치하며, 가운데 직선 즉 평균효과크기 주변에 몰려있다. 하지만 표본크기가 작은 연구들은 표과크기와 표준오차가 더 크기 때문에 그래프의 하단에 위치하며 상대적으로 폭넓게 분포되어 있다. Funnel plot의 대각선은 각 효과크기의 95% 신뢰구간을 나타낸다. 만약, 출판 비뚤림이 없다면 즉, small-study effects가 존재하지 않는다면 funnel plot은 평균을 중심으로 좌우대칭(symmetry)의 모습을 보이게 되며, 반면에 비대칭(asymmetry)의 모습을 보인다면 출판 비뚤림이 있음(biased)을 보여주는 것이다. 비대칭을 파악하는 데는 시각적으로 확인하는 방법과 통계적으로 검증하는 방법 두 가지가 있다.

Funnel plot은 효과크기의 분포가 비대칭임을 쉽게 보여주지만, 시각적 분석은 주관적 판단에 의존하기 때문에 엄격한 방법이 될 수 없으므로 비대칭에 대한 통계적 분석으로 Egger’s regression test를 이용한다. Egger 방법은 각 연구의 효과크기와 표준오차와의 관계를 회귀식으로 설명하며, 효과크기와 표준오차는 관계가 없다는 귀무가설(bias=0 즉, no small-study effects)을 통해 통계적 유의성을 살펴본다. Funnel plot의 비대칭을 검증하기 위한 또 다른 방법으로 Begg & Mazumdar (1994)의 rank correlation test를 이용하기도 한다. 하지만 이 방법은 효과크기와 분산과의 서열상관관계를 검증하기 때문에 Egger의 regression test보다 검증력이 약한 것으로 알려져 있다.


5.3 비뚤림이 결과에 미치는 영향

만약 비뚤림(bias)이 있는 것으로 밝혀졌다면 그 비뚤림은 전체 연구 결과에 어느 정도 영향을 주는가를 밝혀야 한다. 이를 위해 일반적으로 trim-and-fill 방법을 사용하며 과정은 다음과 같다.

1. Trim: funnel plot에서 먼저 좌유대칭이 되도록 대칭이 되지 않는 연구들을 제외한다.
2. 대칭이 되지 않은 연구들을 제외시킨 후 평균을 다시 구한다.
3. Fill: 새로운 평균을 중심으로 하여 제외된 연구들을 복원시킨 후, 이 복원된 연구들과 대칭이 되도록 누락되었다고 생각하는 연구들을 새롭게 채운다. 

메타분석에서는 항상 출판 비뚤림에 대한 분석을 하는 것이 중요하다. 이는 메타분석의 결과가 신빙성이 있는 것인지 아니면 의심스러운지 독자들이 판단할 수 있는 중요한 근거를 제공한다. 따라서 출판 비뚤림 분석은 개별 메타분석 연구뿐만 아니라 메타분석이라는 연구 방법과 연구분야 자체의 진실성(integrity)을 위한 기준이 된다.


5.4 간접흡연과 폐암과의 관계 예제

Hackshaw et al., (1997)는 간접흡연과 폐암과의 관계에 대한 메타분석을 실시하였으며, 그 결과 흡연 배우자를 둔 비흡연 배우자의 간접흡연으로 인한 폐암 발생률이 \(24\%\) 더 높은 것으로 보고하였다. 그러나 효과가 큰 연구들은 작은 연구들에 비해 출판 될 가능성이 높고 따라서 연구에 포함되었겠지만, 효과크기가 작거나 효과가 없는 연구들은 출판될 가능성이 낮아서 연구에 포함되지 못했기 때문에 이러한 결과가 도출되었다는 의견이 제기되었다. 그래서 이러한 이의에 대한 검정이 필요하다.


5.4.0.1 자료 입력 및 분석

publi <- read.table(text='
study yi lower upper vi
study_1 -0.288  -0.84084    0.265475    0.079649
study_2 0.728   -0.20691    1.662006    0.227305
study_3 0.756   0.171673    1.340567    0.088916
study_4 -0.223  -1.08347    0.637175    0.192668
study_5 -0.236  -1.3769 0.905448    0.338993
study_6 0.698   0.084369    0.311897    0.09806
study_7 0.207   -0.21131    0.625334    0.045553
study_8 0.182   -0.76119    1.125838    0.231731
study_9 0.419   -0.1344 0.971824    0.079637
study_10    0.03    -0.88426    0.943388    0.217377
study_11    0.438   -0.10545    0.981966    0.076952
study_12    0.03    -0.49453    0.553638    0.071497
study_13    0.85    -0.20996    1.910264    0.292543
study_14    0.501   0.147782    0.853768    0.032435
study_15    0.174   -0.19933    0.547231    0.036271
study_16    0.419   -0.9461 1.782026    0.483819
study_17    0.77    0.080455    1.459759    0.123808
study_18    0.077   -0.44558    0.599512    0.071079
study_19    0.936   -0.30067    2.17861 0.398166
study_20    0.482   -0.10432    1.069173    0.089616
study_21    0.058   -0.30163    0.418171    0.033717
study_22    -0.236  -0.48464    0.013193    0.016128
study_23    -0.301  -1.13317    0.530963    0.180221
study_24    0.82    -0.28397    1.92353 0.317124
study_25    -0.03   -0.25   0.189074    0.012546
study_26    0.47    -0.19086    1.13087 0.113687
study_27    0.174   -0.41186    0.759763    0.089331
study_28    0.507   -0.31538    1.32902 0.175972
study_29    0.231   0.034836    0.42739 0.010028
study_30    0.095   -0.48017    0.670789    0.086208
study_31    0.507   0.115443    0.898192    0.039872
study_32    0.148   -0.22551    0.522347    0.06397
study_33    0.104   -0.40075    0.609472    0.066414
study_34    0.166   -0.10305    0.434078    0.018775
study_35    0.372   0.015283    0.727838    0.033042
study_36    0.703   -0.73741    2.143606    0.540157
study_37    0.182   -0.11094    0.475588    0.022388
', header=T)

publi
##       study     yi     lower    upper       vi
## 1   study_1 -0.288 -0.840840 0.265475 0.079649
## 2   study_2  0.728 -0.206910 1.662006 0.227305
## 3   study_3  0.756  0.171673 1.340567 0.088916
## 4   study_4 -0.223 -1.083470 0.637175 0.192668
## 5   study_5 -0.236 -1.376900 0.905448 0.338993
## 6   study_6  0.698  0.084369 0.311897 0.098060
## 7   study_7  0.207 -0.211310 0.625334 0.045553
## 8   study_8  0.182 -0.761190 1.125838 0.231731
## 9   study_9  0.419 -0.134400 0.971824 0.079637
## 10 study_10  0.030 -0.884260 0.943388 0.217377
## 11 study_11  0.438 -0.105450 0.981966 0.076952
## 12 study_12  0.030 -0.494530 0.553638 0.071497
## 13 study_13  0.850 -0.209960 1.910264 0.292543
## 14 study_14  0.501  0.147782 0.853768 0.032435
## 15 study_15  0.174 -0.199330 0.547231 0.036271
## 16 study_16  0.419 -0.946100 1.782026 0.483819
## 17 study_17  0.770  0.080455 1.459759 0.123808
## 18 study_18  0.077 -0.445580 0.599512 0.071079
## 19 study_19  0.936 -0.300670 2.178610 0.398166
## 20 study_20  0.482 -0.104320 1.069173 0.089616
## 21 study_21  0.058 -0.301630 0.418171 0.033717
## 22 study_22 -0.236 -0.484640 0.013193 0.016128
## 23 study_23 -0.301 -1.133170 0.530963 0.180221
## 24 study_24  0.820 -0.283970 1.923530 0.317124
## 25 study_25 -0.030 -0.250000 0.189074 0.012546
## 26 study_26  0.470 -0.190860 1.130870 0.113687
## 27 study_27  0.174 -0.411860 0.759763 0.089331
## 28 study_28  0.507 -0.315380 1.329020 0.175972
## 29 study_29  0.231  0.034836 0.427390 0.010028
## 30 study_30  0.095 -0.480170 0.670789 0.086208
## 31 study_31  0.507  0.115443 0.898192 0.039872
## 32 study_32  0.148 -0.225510 0.522347 0.063970
## 33 study_33  0.104 -0.400750 0.609472 0.066414
## 34 study_34  0.166 -0.103050 0.434078 0.018775
## 35 study_35  0.372  0.015283 0.727838 0.033042
## 36 study_36  0.703 -0.737410 2.143606 0.540157
## 37 study_37  0.182 -0.110940 0.475588 0.022388
fit<- metagen(yi,sqrt(vi),
                 data = publi[order(publi$vi),],
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = FALSE,
                 prediction = TRUE,
                 sm = "RR")
fit
##              RR           95%-CI %W(fixed)
## study_29 1.2599 [1.0353; 1.5331]      13.9
## study_25 0.9704 [0.7792; 1.2087]      11.1
## study_22 0.7898 [0.6158; 1.0130]       8.6
## study_34 1.1806 [0.9025; 1.5443]       7.4
## study_37 1.1996 [0.8947; 1.6084]       6.2
## study_14 1.6504 [1.1595; 2.3490]       4.3
## study_35 1.4506 [1.0159; 2.0715]       4.2
## study_21 1.0597 [0.7394; 1.5188]       4.1
## study_15 1.1901 [0.8193; 1.7285]       3.8
## study_31 1.6603 [1.1226; 2.4556]       3.5
## study_7  1.2300 [0.8095; 1.8688]       3.1
## study_32 1.1595 [0.7063; 1.9035]       2.2
## study_33 1.1096 [0.6696; 1.8388]       2.1
## study_18 1.0800 [0.6405; 1.8213]       2.0
## study_12 1.0305 [0.6101; 1.7403]       1.9
## study_11 1.5496 [0.8997; 2.6690]       1.8
## study_9  1.5204 [0.8745; 2.6435]       1.7
## study_1  0.7498 [0.4312; 1.3036]       1.7
## study_30 1.0997 [0.6185; 1.9552]       1.6
## study_3  2.1297 [1.1872; 3.8207]       1.6
## study_27 1.1901 [0.6625; 2.1378]       1.6
## study_20 1.6193 [0.9006; 2.9117]       1.6
## study_6  2.0097 [1.0879; 3.7127]       1.4
## study_26 1.6000 [0.8263; 3.0983]       1.2
## study_17 2.1598 [1.0837; 4.3044]       1.1
## study_28 1.6603 [0.7297; 3.7780]       0.8
## study_23 0.7401 [0.3220; 1.7007]       0.8
## study_4  0.8001 [0.3385; 1.8914]       0.7
## study_10 1.0305 [0.4132; 2.5697]       0.6
## study_2  2.0709 [0.8135; 5.2722]       0.6
## study_8  1.1996 [0.4670; 3.0817]       0.6
## study_13 2.3396 [0.8105; 6.7537]       0.5
## study_24 2.2705 [0.7530; 6.8464]       0.4
## study_5  0.7898 [0.2523; 2.4723]       0.4
## study_19 2.5498 [0.7403; 8.7824]       0.3
## study_16 1.5204 [0.3890; 5.9435]       0.3
## study_36 2.0198 [0.4783; 8.5291]       0.3
## 
## Number of studies combined: k = 37
## 
##                         RR           95%-CI    z  p-value
## Fixed effect model  1.2048 [1.1199; 1.2962] 5.00 < 0.0001
## Prediction interval        [0.9350; 1.6424]              
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0170 [0.0000; 0.0680]; tau = 0.1305 [0.0000; 0.2607]
##  I^2 = 24.2% [0.0%; 49.8%]; H = 1.15 [1.00; 1.41]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  47.49   36  0.0952
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau


5.4.0.2 Forest plot을 이용한 데이터 검토

비뚤림이 존재하는지 살펴보는 가장 좋은 출발점은 forest plot으로 메타분석 결과를 검토해보는 것이다. 여기서는 ’small-study effects’가 존재하는지 살펴보기 위해 자료를 분산 크기순으로 정렬하여 분석하였다(publi[order(publi$vi),]).

forest(fit)

각 개별연구들의 결과(효과크기 및 통계적 유의성)와 패턴, 그리고 전체 연구 결과의 모습(평균효과크기 및 통계적 유의성)을 보여준다. 그림의 아래쪽에 있는 가중치가 작은 연구들 즉, 표본의 크기가 작은 연구들이 대체로 효과크기가 큰 것으로 나타났음을 알 수 있으며, 이는 ’small-study effects’가 존재할 가능성이 있음을 시사한다.


5.4.0.3 Funnel plot을 이용한 ‘small-study effects’ 존재 유무 확인

Funnel plot은 meta package에서 funnel 함수를 이용하여 출력한다. 이때 funnel 함수의 첫번째 인수는 메타분석 결과를 담은 object를 사용한다.

funnel(fit,comb.fixed=T, comb.random=F)

\(X\)축에는 효과크기, \(Y\)축에는 표준오차를 사용하여 표본크기가 작은 연구들이 그래프 하단에 보다 폭넓게 위치할 수 있다. 그리고 relative risk=1.0을 기준으로 볼때 주로 오른쪽에 위치하고 있어 비대칭(asymmetry)임을 육안으로 비교적 쉽게 확인할 수 있다. 하지만 funnel plot은 오류에 대한 증명이 아니라 비뚤림의 가능성(possibility of bias)을 제기하기 위한 도구이며, ’small-study effects’를 검토하기 위한 하나의 일반적인 수단(generic means)이라고 보는 것이 타당하다.


5.4.0.4 비대칭에 대한 통계적 분석

Funnel plot을 통해 효과크기의 분포가 비대칭음을 쉽게 알 수 있지만, 시각적 분석은 주관적 판단에 의존하기 때문에 엄격한 방법이 될 수 없으므로 보다 과학적인 통계적 분석이 필요하다. 이때 일반적으로 활용되는 방법이 Egger’s regression test가 있으며 metabias 함수를 이용한다.

metabias(fit, method.bias="linreg")
## Linear regression test of funnel plot asymmetry
## 
## Test result: t = 2.35, df = 35, p-value = 0.0248
## 
## Sample estimates:
##    bias se.bias intercept se.intercept
##  0.8824  0.3762    0.0101       0.0853
## 
## Details:
## - multiplicative residual heterogeneity variance (tau^2 = 1.1727)
## - predictor: standard error
## - weight:    inverse variance
## - reference: Egger et al. (1997), BMJ

Egger et al., (1997)는 각 연구의 효과크기와 표준오차와의 관계를 회귀식으로 설명하고 있으며, 위의 결과는 bias의 \(p-value\)가 0.0248로 유의수준 \(5\%\)에서 유의함을 알 수 있다. 즉 효과크기와 표준오차는 관계가 없다는 귀무가설(bias=0, no small-study effects)을 기각하게 되어 효과크기와 표준오차의 관계는 통계적으로 유의미한 관계가 있다고 말할 수 있다. 즉, 전반적으로 표본의 크기가 작은 연구들은 큰 연구들보다 간접흡연과 폐암 사이의 관계 곧 효과크기가 크다는 것을 보여주고 있기 때문에 통계적으로도 funnel plot의 비대칭을 증명하게 된다.

Funnel plot의 비대칭성을 검증하기 위한 또 다른 방법으로 Begg & Mazumdar (1994)의 rank correlation test를 이용할 수 있다. 이 방법은 효과크기와 분산과의 서열상관관계를 검증하기 때문에 Egger의 regression test보다 검증력이 약한 것으로 평가되어 널리 사용되지는 않는다. 이 방법 역시 metabias 함수를 이용하여 사용할 수 있다.

metabias(fit, method.bias="rank")
## Rank correlation test of funnel plot asymmetry
## 
## Test result: z = 1.23, p-value = 0.2189
## 
## Sample estimates:
##       ks   se.ks
##  94.0000 76.4591
## 
## - reference: Begg & Mazumdar (1993), Biometrics

6 누적메타분석과 민감도분석

6.1 누적메타분석

메타분석에서는 전체 분석 결과의 오류 검정에 대한 분석 방법으로 출판 비뚤림 분석과 더불어 ‘누적메타분석’과 ‘민감도분석’이 많이 활용된다. 누적메타분석(cumulative meta-analysis)은 시간의 흐름에 따라 연구 결과나 트렌드가 어떻게 달라지는가를 추적하는 분석 방법이다. 즉, 출판연도별로 정렬하여 시간이 경과함에 따라 효과크기가 어떻게 변화하는지 분석할 수 있다. 또 다른 방법은 연구의 정밀성, 즉 표본이 큰 연구들로부터 차례로 투입하여 효과크기가 어떻게 달라지는지를 분석할 수 있다.


6.1.1 시간적 순서에 따른 누적메타분석

시간적 순서에 따른 누적메타분석을 위해 일차진료기관에서 우울증에 대한 전통적인 치료방법과 여러 전문가를 참여시킨 연합적 치료방법(collaborative care)의 치료효과를 비교한 35개 연구를 살펴보자(Gilbody et al., 2006).

cum <- read.table(text='
study   yi  vi  setting year
"Adler et al, 31(2004)" 0.19    0.01    1   2004
"Akerblad et al, 32(2003)"  0.26    0.009   0   2003
"Araya et al, 33(2003)" 1.13    0.03    0   2003
"Blanchard et al, 34(1995)" 0.43    0.05    0   1995
"Brook et al, 35(2003)" 0   0.03    0   2003
"Bruce et al, 36(2004)" 0.3 0.013   1   2004
"Callahan et al, 37(1994)"  0.05    0.073   1   1994
"Cappocia et al, 38(2004)"  0.17    0.079   1   2004
"Coleman et al, 39(1999)"   -0.14   0.04    1   1999
"Datto et al, 40(2003)" 0.42    0.082   1   2003
"Dietrich et al, 41(2004)"  0.16    0.014   1   2004
"Finley et al, 42(2000)"    -0.3    0.075   1   2000
"Hunkeler et al, 43(2000)"  0.28    0.016   1   2000
"Jarjoura et al, 44(2004)"  0.42    0.044   1   2004
"Katon et al, 45(2001)" 0.11    0.011   1   2001
"Katon et al, 46(2004)" 0.24    0.019   1   2004
"Katon et al, 47(1995)" 0.19    0.024   1   1995
"Katon et al, 47(1996)" 0.49    0.034   1   1996
"Katon et al, 48(1999)" 0.31    0.023   1   1999
"Katzelnick et al, 49(2000)"    0.43    0.011   1   2000
"Mann et al, 50(1998)"  -0.08   0.011   0   1998
"Oslin et al, 51(2003)" 0.61    0.072   1   2003
"Peyeler et al, 16(1999)"   0.21    0.027   0   1999
"Rickles et al, 52(2004)"   0.25    0.1 1   2004
"Rost et al, 53(2001a)" 0.2 0.023   1   2001
"Rost et al, 53(2001b)" 0.29    0.029   1   2001
"Smion et al, 54(2000)" 0.3 0.013   1   2000
"Smion et al, 55(2004a)"    0.18    0.021   1   2004
"Smion et al, 55(2004b)"    0.33    0.021   1   2004
"Swindle et al, 56(2003)"   0.18    0.06    1   2003
"Unutzer et al, 57(2001)"   0.405   0.002   1   2001
"Wells et al, 17(2000 medication)"  0.22    0.015   1   2000
"Wells et al, 17(2000 therapy)" 0.22    0.014   1   2000
"Whooley et al, 58(2000)"   0.16    0.036   1   2000
"Wilkinson et al, 59(1993)" -0.29   0.066   0   1993
', header=T)

cum
##                               study     yi    vi setting year
## 1             Adler et al, 31(2004)  0.190 0.010       1 2004
## 2          Akerblad et al, 32(2003)  0.260 0.009       0 2003
## 3             Araya et al, 33(2003)  1.130 0.030       0 2003
## 4         Blanchard et al, 34(1995)  0.430 0.050       0 1995
## 5             Brook et al, 35(2003)  0.000 0.030       0 2003
## 6             Bruce et al, 36(2004)  0.300 0.013       1 2004
## 7          Callahan et al, 37(1994)  0.050 0.073       1 1994
## 8          Cappocia et al, 38(2004)  0.170 0.079       1 2004
## 9           Coleman et al, 39(1999) -0.140 0.040       1 1999
## 10            Datto et al, 40(2003)  0.420 0.082       1 2003
## 11         Dietrich et al, 41(2004)  0.160 0.014       1 2004
## 12           Finley et al, 42(2000) -0.300 0.075       1 2000
## 13         Hunkeler et al, 43(2000)  0.280 0.016       1 2000
## 14         Jarjoura et al, 44(2004)  0.420 0.044       1 2004
## 15            Katon et al, 45(2001)  0.110 0.011       1 2001
## 16            Katon et al, 46(2004)  0.240 0.019       1 2004
## 17            Katon et al, 47(1995)  0.190 0.024       1 1995
## 18            Katon et al, 47(1996)  0.490 0.034       1 1996
## 19            Katon et al, 48(1999)  0.310 0.023       1 1999
## 20       Katzelnick et al, 49(2000)  0.430 0.011       1 2000
## 21             Mann et al, 50(1998) -0.080 0.011       0 1998
## 22            Oslin et al, 51(2003)  0.610 0.072       1 2003
## 23          Peyeler et al, 16(1999)  0.210 0.027       0 1999
## 24          Rickles et al, 52(2004)  0.250 0.100       1 2004
## 25            Rost et al, 53(2001a)  0.200 0.023       1 2001
## 26            Rost et al, 53(2001b)  0.290 0.029       1 2001
## 27            Smion et al, 54(2000)  0.300 0.013       1 2000
## 28           Smion et al, 55(2004a)  0.180 0.021       1 2004
## 29           Smion et al, 55(2004b)  0.330 0.021       1 2004
## 30          Swindle et al, 56(2003)  0.180 0.060       1 2003
## 31          Unutzer et al, 57(2001)  0.405 0.002       1 2001
## 32 Wells et al, 17(2000 medication)  0.220 0.015       1 2000
## 33    Wells et al, 17(2000 therapy)  0.220 0.014       1 2000
## 34          Whooley et al, 58(2000)  0.160 0.036       1 2000
## 35        Wilkinson et al, 59(1993) -0.290 0.066       0 1993

자료를 연도순으로 정렬하면 다음과 같다.

cum <- cum[order(cum$year),]

head(cum, 10)
##                        study    yi    vi setting year
## 35 Wilkinson et al, 59(1993) -0.29 0.066       0 1993
## 7   Callahan et al, 37(1994)  0.05 0.073       1 1994
## 4  Blanchard et al, 34(1995)  0.43 0.050       0 1995
## 17     Katon et al, 47(1995)  0.19 0.024       1 1995
## 18     Katon et al, 47(1996)  0.49 0.034       1 1996
## 21      Mann et al, 50(1998) -0.08 0.011       0 1998
## 9    Coleman et al, 39(1999) -0.14 0.040       1 1999
## 19     Katon et al, 48(1999)  0.31 0.023       1 1999
## 23   Peyeler et al, 16(1999)  0.21 0.027       0 1999
## 12    Finley et al, 42(2000) -0.30 0.075       1 2000
fit<- metagen(yi,sqrt(vi),
                 data = cum,
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = FALSE,
                 prediction = TRUE,
                 sm = "SMD")
fit
##                                      SMD            95%-CI %W(fixed)
## Wilkinson et al, 59(1993)        -0.2900 [-0.7935; 0.2135]       0.7
## Callahan et al, 37(1994)          0.0500 [-0.4796; 0.5796]       0.7
## Blanchard et al, 34(1995)         0.4300 [-0.0083; 0.8683]       1.0
## Katon et al, 47(1995)             0.1900 [-0.1136; 0.4936]       2.0
## Katon et al, 47(1996)             0.4900 [ 0.1286; 0.8514]       1.4
## Mann et al, 50(1998)             -0.0800 [-0.2856; 0.1256]       4.4
## Coleman et al, 39(1999)          -0.1400 [-0.5320; 0.2520]       1.2
## Katon et al, 48(1999)             0.3100 [ 0.0128; 0.6072]       2.1
## Peyeler et al, 16(1999)           0.2100 [-0.1121; 0.5321]       1.8
## Finley et al, 42(2000)           -0.3000 [-0.8368; 0.2368]       0.6
## Hunkeler et al, 43(2000)          0.2800 [ 0.0321; 0.5279]       3.0
## Katzelnick et al, 49(2000)        0.4300 [ 0.2244; 0.6356]       4.4
## Smion et al, 54(2000)             0.3000 [ 0.0765; 0.5235]       3.7
## Wells et al, 17(2000 medication)  0.2200 [-0.0200; 0.4600]       3.2
## Wells et al, 17(2000 therapy)     0.2200 [-0.0119; 0.4519]       3.5
## Whooley et al, 58(2000)           0.1600 [-0.2119; 0.5319]       1.4
## Katon et al, 45(2001)             0.1100 [-0.0956; 0.3156]       4.4
## Rost et al, 53(2001a)             0.2000 [-0.0972; 0.4972]       2.1
## Rost et al, 53(2001b)             0.2900 [-0.0438; 0.6238]       1.7
## Unutzer et al, 57(2001)           0.4050 [ 0.3173; 0.4927]      24.3
## Akerblad et al, 32(2003)          0.2600 [ 0.0741; 0.4459]       5.4
## Araya et al, 33(2003)             1.1300 [ 0.7905; 1.4695]       1.6
## Brook et al, 35(2003)             0.0000 [-0.3395; 0.3395]       1.6
## Datto et al, 40(2003)             0.4200 [-0.1412; 0.9812]       0.6
## Oslin et al, 51(2003)             0.6100 [ 0.0841; 1.1359]       0.7
## Swindle et al, 56(2003)           0.1800 [-0.3001; 0.6601]       0.8
## Adler et al, 31(2004)             0.1900 [-0.0060; 0.3860]       4.9
## Bruce et al, 36(2004)             0.3000 [ 0.0765; 0.5235]       3.7
## Cappocia et al, 38(2004)          0.1700 [-0.3809; 0.7209]       0.6
## Dietrich et al, 41(2004)          0.1600 [-0.0719; 0.3919]       3.5
## Jarjoura et al, 44(2004)          0.4200 [ 0.0089; 0.8311]       1.1
## Katon et al, 46(2004)             0.2400 [-0.0302; 0.5102]       2.6
## Rickles et al, 52(2004)           0.2500 [-0.3698; 0.8698]       0.5
## Smion et al, 55(2004a)            0.1800 [-0.1040; 0.4640]       2.3
## Smion et al, 55(2004b)            0.3300 [ 0.0460; 0.6140]       2.3
## 
## Number of studies combined: k = 35
## 
##                        SMD            95%-CI     z  p-value
## Fixed effect model  0.2757 [ 0.2325; 0.3190] 12.51 < 0.0001
## Prediction interval        [-0.0583; 0.5532]               
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0213 [0.0071; 0.0618]; tau = 0.1458 [0.0843; 0.2486]
##  I^2 = 54.1% [32.7%; 68.7%]; H = 1.48 [1.22; 1.79]
## 
## Test of heterogeneity:
##      Q d.f.  p-value
##  74.10   34 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
forest(fit, layout="RevMan5")


meta packages에서 누적메타분석(cumulative meta-analysis)는 metacum 함수를 이용한다.

forest(metacum(fit), layout="RevMan5")

누적분석 결과를 살펴보면, 1990년대 중반 이후 특히 2000년대에 들어서면서 연합적 치료방법의 효과가 전통적인 치료방법에 비해 긍정적이면서 안정적인 결과(0.20~0.28)를 보여주고 있음을 알 수 있다.


6.1.2 표본크기에 따른 누적메타분석

누적메타분석은 시간의 흐름에 따라 결과가 어떻게 축적되어 나타나는지를 검증하는 방법으로 고안되었지만 표본크기가 큰 연구부터 투입하여 효과크기가 어떻게 변화하는지를 분석할 수 있다. 즉, 표본크기가 큰 연구들부터 차례로 투입함으로써 효과크기가 어느 정도 안정화(stabilized)되면 표본크기가 작은 연구들을 더 투입해도 효과크기에 큰 변화가 나타나지 않는지를 확인한다. 만약 그렇게 되면 작은 연구들이 전체효과크기에 영향을 미친다고 보기 어렵다.

앞서 사용한 간접흡연이 배우자의 폐암 발생에 미치는 영향을 분석한 자료로 살펴보자.

meta packages에서 누적메타분석(cumulative meta-analysis)는 metacum 함수를 이용한다.

publi <- read.table(text='
study yi lower upper vi
study_1 -0.288  -0.84084    0.265475    0.079649
study_2 0.728   -0.20691    1.662006    0.227305
study_3 0.756   0.171673    1.340567    0.088916
study_4 -0.223  -1.08347    0.637175    0.192668
study_5 -0.236  -1.3769 0.905448    0.338993
study_6 0.698   0.084369    0.311897    0.09806
study_7 0.207   -0.21131    0.625334    0.045553
study_8 0.182   -0.76119    1.125838    0.231731
study_9 0.419   -0.1344 0.971824    0.079637
study_10    0.03    -0.88426    0.943388    0.217377
study_11    0.438   -0.10545    0.981966    0.076952
study_12    0.03    -0.49453    0.553638    0.071497
study_13    0.85    -0.20996    1.910264    0.292543
study_14    0.501   0.147782    0.853768    0.032435
study_15    0.174   -0.19933    0.547231    0.036271
study_16    0.419   -0.9461 1.782026    0.483819
study_17    0.77    0.080455    1.459759    0.123808
study_18    0.077   -0.44558    0.599512    0.071079
study_19    0.936   -0.30067    2.17861 0.398166
study_20    0.482   -0.10432    1.069173    0.089616
study_21    0.058   -0.30163    0.418171    0.033717
study_22    -0.236  -0.48464    0.013193    0.016128
study_23    -0.301  -1.13317    0.530963    0.180221
study_24    0.82    -0.28397    1.92353 0.317124
study_25    -0.03   -0.25   0.189074    0.012546
study_26    0.47    -0.19086    1.13087 0.113687
study_27    0.174   -0.41186    0.759763    0.089331
study_28    0.507   -0.31538    1.32902 0.175972
study_29    0.231   0.034836    0.42739 0.010028
study_30    0.095   -0.48017    0.670789    0.086208
study_31    0.507   0.115443    0.898192    0.039872
study_32    0.148   -0.22551    0.522347    0.06397
study_33    0.104   -0.40075    0.609472    0.066414
study_34    0.166   -0.10305    0.434078    0.018775
study_35    0.372   0.015283    0.727838    0.033042
study_36    0.703   -0.73741    2.143606    0.540157
study_37    0.182   -0.11094    0.475588    0.022388
', header=T)

publi
##       study     yi     lower    upper       vi
## 1   study_1 -0.288 -0.840840 0.265475 0.079649
## 2   study_2  0.728 -0.206910 1.662006 0.227305
## 3   study_3  0.756  0.171673 1.340567 0.088916
## 4   study_4 -0.223 -1.083470 0.637175 0.192668
## 5   study_5 -0.236 -1.376900 0.905448 0.338993
## 6   study_6  0.698  0.084369 0.311897 0.098060
## 7   study_7  0.207 -0.211310 0.625334 0.045553
## 8   study_8  0.182 -0.761190 1.125838 0.231731
## 9   study_9  0.419 -0.134400 0.971824 0.079637
## 10 study_10  0.030 -0.884260 0.943388 0.217377
## 11 study_11  0.438 -0.105450 0.981966 0.076952
## 12 study_12  0.030 -0.494530 0.553638 0.071497
## 13 study_13  0.850 -0.209960 1.910264 0.292543
## 14 study_14  0.501  0.147782 0.853768 0.032435
## 15 study_15  0.174 -0.199330 0.547231 0.036271
## 16 study_16  0.419 -0.946100 1.782026 0.483819
## 17 study_17  0.770  0.080455 1.459759 0.123808
## 18 study_18  0.077 -0.445580 0.599512 0.071079
## 19 study_19  0.936 -0.300670 2.178610 0.398166
## 20 study_20  0.482 -0.104320 1.069173 0.089616
## 21 study_21  0.058 -0.301630 0.418171 0.033717
## 22 study_22 -0.236 -0.484640 0.013193 0.016128
## 23 study_23 -0.301 -1.133170 0.530963 0.180221
## 24 study_24  0.820 -0.283970 1.923530 0.317124
## 25 study_25 -0.030 -0.250000 0.189074 0.012546
## 26 study_26  0.470 -0.190860 1.130870 0.113687
## 27 study_27  0.174 -0.411860 0.759763 0.089331
## 28 study_28  0.507 -0.315380 1.329020 0.175972
## 29 study_29  0.231  0.034836 0.427390 0.010028
## 30 study_30  0.095 -0.480170 0.670789 0.086208
## 31 study_31  0.507  0.115443 0.898192 0.039872
## 32 study_32  0.148 -0.225510 0.522347 0.063970
## 33 study_33  0.104 -0.400750 0.609472 0.066414
## 34 study_34  0.166 -0.103050 0.434078 0.018775
## 35 study_35  0.372  0.015283 0.727838 0.033042
## 36 study_36  0.703 -0.737410 2.143606 0.540157
## 37 study_37  0.182 -0.110940 0.475588 0.022388
publi2 <- publi[order(publi$vi),]
fit_pub2<- metagen(yi,sqrt(vi),
                 data = publi2,
                 studlab = paste(study),
                 comb.fixed = TRUE,
                 comb.random = FALSE,
                 prediction = TRUE,
                 sm = "RR")
fit_pub2
##              RR           95%-CI %W(fixed)
## study_29 1.2599 [1.0353; 1.5331]      13.9
## study_25 0.9704 [0.7792; 1.2087]      11.1
## study_22 0.7898 [0.6158; 1.0130]       8.6
## study_34 1.1806 [0.9025; 1.5443]       7.4
## study_37 1.1996 [0.8947; 1.6084]       6.2
## study_14 1.6504 [1.1595; 2.3490]       4.3
## study_35 1.4506 [1.0159; 2.0715]       4.2
## study_21 1.0597 [0.7394; 1.5188]       4.1
## study_15 1.1901 [0.8193; 1.7285]       3.8
## study_31 1.6603 [1.1226; 2.4556]       3.5
## study_7  1.2300 [0.8095; 1.8688]       3.1
## study_32 1.1595 [0.7063; 1.9035]       2.2
## study_33 1.1096 [0.6696; 1.8388]       2.1
## study_18 1.0800 [0.6405; 1.8213]       2.0
## study_12 1.0305 [0.6101; 1.7403]       1.9
## study_11 1.5496 [0.8997; 2.6690]       1.8
## study_9  1.5204 [0.8745; 2.6435]       1.7
## study_1  0.7498 [0.4312; 1.3036]       1.7
## study_30 1.0997 [0.6185; 1.9552]       1.6
## study_3  2.1297 [1.1872; 3.8207]       1.6
## study_27 1.1901 [0.6625; 2.1378]       1.6
## study_20 1.6193 [0.9006; 2.9117]       1.6
## study_6  2.0097 [1.0879; 3.7127]       1.4
## study_26 1.6000 [0.8263; 3.0983]       1.2
## study_17 2.1598 [1.0837; 4.3044]       1.1
## study_28 1.6603 [0.7297; 3.7780]       0.8
## study_23 0.7401 [0.3220; 1.7007]       0.8
## study_4  0.8001 [0.3385; 1.8914]       0.7
## study_10 1.0305 [0.4132; 2.5697]       0.6
## study_2  2.0709 [0.8135; 5.2722]       0.6
## study_8  1.1996 [0.4670; 3.0817]       0.6
## study_13 2.3396 [0.8105; 6.7537]       0.5
## study_24 2.2705 [0.7530; 6.8464]       0.4
## study_5  0.7898 [0.2523; 2.4723]       0.4
## study_19 2.5498 [0.7403; 8.7824]       0.3
## study_16 1.5204 [0.3890; 5.9435]       0.3
## study_36 2.0198 [0.4783; 8.5291]       0.3
## 
## Number of studies combined: k = 37
## 
##                         RR           95%-CI    z  p-value
## Fixed effect model  1.2048 [1.1199; 1.2962] 5.00 < 0.0001
## Prediction interval        [0.9350; 1.6424]              
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0170 [0.0000; 0.0680]; tau = 0.1305 [0.0000; 0.2607]
##  I^2 = 24.2% [0.0%; 49.8%]; H = 1.15 [1.00; 1.41]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  47.49   36  0.0952
## 
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
forest(metacum(fit_pub2, sortvar=publi2$vi) )

연구 크기순으로 22개(study 20까지) 연구를 투입했을 때(이때 누적가중치는 \(90\%\)에 달하는데) 전체효과크기는 1.17로 나타났다. 그리고 나머지 15개의 상대적으로 작은 연구들을 투입하여도 전체효과크기는 1.20으로 조금 증가해 전체 결과에 큰 영향을 미치지는 못하는 것으로 나타났따. 따라서 효과의 크기가 큰 것으로 나타난 작은 표본의 연구들이 전체 결과에 영향을 주는, 즉 비뚤림을 일으키는 원인이라고 말할 수 없다고 하겠다.

요약하면 누적메타분석은 각 연구들이 더해지면서 평균효과크기와 신뢰구간이 어떻게 달라지는 지를 보여준다. 그리고 누적메타분석은 민감도분석의 한 부분으로도 활용될 수 있어 새로운 연구들이 추가되면서 연구 결과(결론)가 어떻게 달라지는지 또는 변함이 없는지를 보여준다.


6.2 민감도분석

민감도분석(sensitivity analysis)은 분석의 기준이나 내용에 따라 그 결과가 어떻게(민감하게) 변화하는지를 검토하는 분석 방법으로, 그 기준은 다음과 같다.

기준 내용
연구 포함 기준 기준에 따라 어떤 특정한 연구나 몇몇 연구가 누락되게 되면 전체적인 결론이 크게 다른게 나타나는가를 검증한다.
통계적 방법 효과크기의 종류(risk ratio 또는 odds ratio), 효과크기의 산출 모형(고정효과모형 또는 랜덤효과모형)
누락된 데이터를 다루는 방법 누락된 연구를 포함시켰을 때 결과가 어느 정도 달라지는가를 검층한다(예: trim-and fill)

민감도분석은 서로 다른 조건(가정)하에서 도출된 분석 결과가 일관성을 보이는지 검증하는 방법이라고 할 수 있다. 즉 체계적 리뷰 과정에서 이루어진 여러 가지 결정의 영향력을 검증하기 위해 그리고 누락된 데이터의 영향을 탐색하기 위해 사용할 수 있다.

## Extensive documentation for the dmetar package can be found at: 
##  www.bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/
madata <- read.table(text='
Author  TE  seTE
"Call et al."   0.7091  0.2608
"Cavanagh et al."   0.3549  0.1964
"DanitzOrsillo" 1.7912  0.3456
"de Vibe et al."    0.1825  0.1178
"Frazier et al."    0.4219  0.1448
"Frogeli et al."    0.6300  0.1960
"Gallego et al."    0.7249  0.2247
"Hazlett-Stevens & Oren"    0.5287  0.2105
"Hintz et al."  0.2840  0.1680
"Kang et al."   1.2751  0.3372
"Kuhlmann et al."   0.1036  0.1947
"Lever Taylor et al."   0.3884  0.2308
"Phang et al."  0.5407  0.2443
"Rasanen et al."    0.4262  0.2579
"Ratanasiripong"    0.5154  0.3513
"Shapiro et al."    1.4797  0.3153
"SongLindquist" 0.6126  0.2267
"Warnecke et al."   0.6000  0.2490
', header=T)

madata
##                    Author     TE   seTE
## 1             Call et al. 0.7091 0.2608
## 2         Cavanagh et al. 0.3549 0.1964
## 3           DanitzOrsillo 1.7912 0.3456
## 4          de Vibe et al. 0.1825 0.1178
## 5          Frazier et al. 0.4219 0.1448
## 6          Frogeli et al. 0.6300 0.1960
## 7          Gallego et al. 0.7249 0.2247
## 8  Hazlett-Stevens & Oren 0.5287 0.2105
## 9            Hintz et al. 0.2840 0.1680
## 10            Kang et al. 1.2751 0.3372
## 11        Kuhlmann et al. 0.1036 0.1947
## 12    Lever Taylor et al. 0.3884 0.2308
## 13           Phang et al. 0.5407 0.2443
## 14         Rasanen et al. 0.4262 0.2579
## 15         Ratanasiripong 0.5154 0.3513
## 16         Shapiro et al. 1.4797 0.3153
## 17          SongLindquist 0.6126 0.2267
## 18        Warnecke et al. 0.6000 0.2490
  m.hksj <- metagen(TE,
                  seTE,
                  data = madata,
                  studlab = paste(Author),
                  comb.fixed = FALSE,
                  comb.random = TRUE,
                  method.tau = "SJ",
                  hakn = TRUE,
                  prediction = TRUE,
                  sm = "SMD")
m.hksj
##                           SMD            95%-CI %W(random)
## Call et al.            0.7091 [ 0.1979; 1.2203]        5.2
## Cavanagh et al.        0.3549 [-0.0300; 0.7398]        6.1
## DanitzOrsillo          1.7912 [ 1.1138; 2.4686]        4.2
## de Vibe et al.         0.1825 [-0.0484; 0.4134]        7.1
## Frazier et al.         0.4219 [ 0.1381; 0.7057]        6.8
## Frogeli et al.         0.6300 [ 0.2458; 1.0142]        6.1
## Gallego et al.         0.7249 [ 0.2845; 1.1653]        5.7
## Hazlett-Stevens & Oren 0.5287 [ 0.1161; 0.9413]        5.9
## Hintz et al.           0.2840 [-0.0453; 0.6133]        6.5
## Kang et al.            1.2751 [ 0.6142; 1.9360]        4.3
## Kuhlmann et al.        0.1036 [-0.2780; 0.4852]        6.1
## Lever Taylor et al.    0.3884 [-0.0640; 0.8408]        5.6
## Phang et al.           0.5407 [ 0.0619; 1.0195]        5.4
## Rasanen et al.         0.4262 [-0.0793; 0.9317]        5.3
## Ratanasiripong         0.5154 [-0.1731; 1.2039]        4.1
## Shapiro et al.         1.4797 [ 0.8617; 2.0977]        4.5
## SongLindquist          0.6126 [ 0.1683; 1.0569]        5.7
## Warnecke et al.        0.6000 [ 0.1120; 1.0880]        5.4
## 
## Number of studies combined: k = 18
## 
##                         SMD            95%-CI    t  p-value
## Random effects model 0.5935 [ 0.3892; 0.7979] 6.13 < 0.0001
## Prediction interval         [-0.2083; 1.3954]              
## 
## Quantifying heterogeneity:
##  tau^2 = 0.1337 [0.0295; 0.3533]; tau = 0.3656 [0.1717; 0.5944]
##  I^2 = 62.6% [37.9%; 77.5%]; H = 1.64 [1.27; 2.11]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  45.50   17  0.0002
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Sidik-Jonkman estimator for tau^2
## - Q-profile method for confidence interval of tau^2 and tau
## - Hartung-Knapp adjustment for random effects model
forest(m.hksj )

inf.analysis <- InfluenceAnalysis(x = m.hksj,
                                  random = TRUE)
## [===========================================================================] DONE
summary(inf.analysis)
## Leave-One-Out Analysis (Sorted by I2) 
##  ----------------------------------- 
##                                 Effect  LLCI  ULCI    I2
## Omitting DanitzOrsillo           0.527 0.362 0.691 0.481
## Omitting Shapiro et al.          0.544 0.358 0.731 0.545
## Omitting de Vibe et al.          0.624 0.414 0.835 0.576
## Omitting Kang et al.             0.560 0.360 0.761 0.598
## Omitting Kuhlmann et al.         0.624 0.417 0.831 0.614
## Omitting Hintz et al.            0.616 0.401 0.830 0.636
## Omitting Gallego et al.          0.588 0.370 0.806 0.638
## Omitting Call et al.             0.590 0.372 0.807 0.642
## Omitting Frogeli et al.          0.594 0.375 0.813 0.643
## Omitting Cavanagh et al.         0.611 0.394 0.827 0.645
## Omitting SongLindquist           0.595 0.376 0.814 0.646
## Omitting Warnecke et al.         0.596 0.377 0.814 0.646
## Omitting Frazier et al.          0.608 0.390 0.826 0.647
## Omitting Lever Taylor et al.     0.608 0.391 0.824 0.647
## Omitting Hazlett-Stevens & Oren  0.600 0.381 0.819 0.648
## Omitting Phang et al.            0.599 0.381 0.818 0.648
## Omitting Rasanen et al.          0.605 0.388 0.822 0.648
## Omitting Ratanasiripong          0.599 0.382 0.816 0.648
## 
## 
## Influence Diagnostics 
##  ------------------- 
##                                 rstudent dffits cook.d cov.r QE.del   hat
## Omitting Call et al.               0.253  0.038  0.001 1.114 44.700 0.052
## Omitting Cavanagh et al.          -0.586 -0.163  0.027 1.101 45.060 0.061
## Omitting DanitzOrsillo             2.828  0.746  0.423 0.694 30.815 0.042
## Omitting de Vibe et al.           -1.121 -0.304  0.091 1.058 37.740 0.071
## Omitting Frazier et al.           -0.445 -0.137  0.020 1.120 45.311 0.068
## Omitting Frogeli et al.            0.082 -0.002  0.000 1.127 44.875 0.061
## Omitting Gallego et al.            0.302  0.053  0.003 1.118 44.254 0.057
## Omitting Hazlett-Stevens & Oren   -0.160 -0.062  0.004 1.122 45.441 0.059
## Omitting Hintz et al.             -0.790 -0.215  0.047 1.087 43.999 0.065
## Omitting Kang et al.               1.445  0.332  0.104 0.970 39.823 0.043
## Omitting Kuhlmann et al.          -1.242 -0.301  0.087 1.025 41.492 0.061
## Omitting Lever Taylor et al.      -0.483 -0.134  0.019 1.103 45.329 0.056
## Omitting Phang et al.             -0.126 -0.053  0.003 1.118 45.433 0.054
## Omitting Rasanen et al.           -0.381 -0.109  0.012 1.105 45.450 0.053
## Omitting Ratanasiripong           -0.159 -0.055  0.003 1.101 45.486 0.041
## Omitting Shapiro et al.            2.037  0.516  0.230 0.867 35.203 0.045
## Omitting SongLindquist             0.039 -0.014  0.000 1.122 45.140 0.057
## Omitting Warnecke et al.           0.009 -0.021  0.000 1.119 45.257 0.054
##                                 weight infl
## Omitting Call et al.             5.215     
## Omitting Cavanagh et al.         6.106     
## Omitting DanitzOrsillo           4.156    *
## Omitting de Vibe et al.          7.128     
## Omitting Frazier et al.          6.801     
## Omitting Frogeli et al.          6.112     
## Omitting Gallego et al.          5.711     
## Omitting Hazlett-Stevens & Oren  5.909     
## Omitting Hintz et al.            6.497     
## Omitting Kang et al.             4.252     
## Omitting Kuhlmann et al.         6.130     
## Omitting Lever Taylor et al.     5.626     
## Omitting Phang et al.            5.440     
## Omitting Rasanen et al.          5.254     
## Omitting Ratanasiripong          4.091     
## Omitting Shapiro et al.          4.513     
## Omitting SongLindquist           5.683     
## Omitting Warnecke et al.         5.375     
## 
## 
## Baujat Diagnostics (sorted by Heterogeneity Contribution) 
##  ------------------------------------------------------- 
##                                 HetContrib InfluenceEffectSize
## Omitting DanitzOrsillo              14.383               0.298
## Omitting Shapiro et al.             10.042               0.251
## Omitting de Vibe et al.              6.400               1.356
## Omitting Kang et al.                 5.553               0.121
## Omitting Kuhlmann et al.             3.748               0.256
## Omitting Hintz et al.                1.368               0.129
## Omitting Gallego et al.              1.183               0.060
## Omitting Call et al.                 0.768               0.028
## Omitting Frogeli et al.              0.582               0.039
## Omitting Cavanagh et al.             0.409               0.027
## Omitting SongLindquist               0.339               0.017
## Omitting Warnecke et al.             0.230               0.009
## Omitting Frazier et al.              0.164               0.021
## Omitting Lever Taylor et al.         0.159               0.008
## Omitting Phang et al.                0.061               0.003
## Omitting Hazlett-Stevens & Oren      0.052               0.003
## Omitting Rasanen et al.              0.044               0.002
## Omitting Ratanasiripong              0.010               0.000

Leave-one-out Analysis

plot(inf.analysis, "es")

즉 어떤 특정한 연구를 제외하거나 또는 포함시켰을 때 전체 평균효과크기가 어떻게 달라지며, 전체 연구 결과에 얼마나 변화가 있는지를 검증하는 것이 바로 민감도분석의 목적이다.

7 네트워크 메타분석

7.1 네트워크 메타분석의 이해

네트워크 메타분석(network meta-analysis, NMA)은 다중비교(multiple treatment meta-analysis) 또는 혼합비교(mixed treatment comparison)라고도 불리며, 다수의 치료(intervention 또는 treatment)를 가진 여러 연구들의 효과크기를 종합하는 것이다 (White, 2015).

기존의 일반적인 메타분석(pairwise meta-analysis)에서는 동일한 치료를 실시한 연구들을 모아 치료군과 비교군으로 두 군의 짝을 만든 후 효과크기를 직접 계산하였다. 그러나 네트워크 메타분석에서는 치료그룹별 직접비교 연구가 없거나 치료가 서로 다르다고 하더라도 간접비교(indirect treatment comparison) 방법을 이용하여 치료그룹 간의 효과크기를 계산할 수 있다.

  • 관계도

International Society for Pharmacoeconomics and Outcomes Research (ISPOR) 에서는 근거가 2개 이상인 치료를 연결하는 2개 이상의 임상연구(randomized clinical trial)가 있는 경우에 네트워크 메타분석이라는 용어를 사용한다. 이때 네트워크가 열려 있어 loop를 구성하지 못하면 간접비교(indirect treatment comparison, ITC)를 제안하고, 네트워크가 닫혀 있어서 loop를 구성하면 혼합비교(mixed treatment comparison, MTC)를 제안하였다. (Jansen et al., 2011)


7.1.1 네트워크 메타분석의 통계적 접근

네트워크 메타분석을 실행하는 방법은 크게 베이지안(Bayesian) 방법과 빈도주의적(frequentist) 방법으로 나누어볼 수 있다. 두 통계법의 차이는 통계모형에 접근하는 근본적인 개념의 차이에서 기인하며 표본크기가 클 경우 동일한 결과를 나타낸다.

우선 기존 네트워크 메타분석에서 상대적으로 많이 시행되는 ‘베이지안 방법’은 사전에 알려진 정보(prior probasbility 또는 external information)를 바탕으로 현재의 자료에서 주어진 정보(present data)를 더하여 연구가설이 참(true)일 사후확률(posterior probability)을 산출하는 것이다. 따라서 베이지안 방법은 사전정보에 따라 연구가설이 참일 확률이 변할 수 있는 확률적인 접근이라고 할 수 있다.

반면에 빈도주의적 방법은 일반적인 통계이론에 근거하여 현재 주어진 자료가 무한히 반복되었을 때 연구가설이 기각되거나 받아들여질 유의확률이나 신뢰구간에 기반한다. 따라서 빈도주의적 방법은 외적 정보와 무관하며, 주어진 자료 내에서 연구가설이 참일 확률이 이미 특정되어 있어서 단지 이것이 받아들여지거나 기각될지를 유의수준으로 판단한다.

베이지안 방법 빈도주의적 방법
기본개념(basic concept) 베이지안 이론(Bayesian therorem) 자료의 분포(distribution)
사용되는 정보(information used) 사전확률(prior probability) & 연구자료(present data) 연구자료(present data only)
불확실성 측정(uncertainty measurment) 신용구간(credible interval, Crl) 신뢰구간(confidence interval, CI)
연구가설 검정(hypothesis testing) 연구가설이 참일 확률, 즉 사후확률을 직접 계산함
귀무가설을 기각함으로써 연구 가설을 증명

다수의 선행연구를 참조하고 다양한 약물의 효과크기를 통해서 실제 현상을 설명하기에는 베이지안 방법이 빈도주의적 방법보다 논리적이고 타당하다고 볼 수 있다. 그러나 베이지안 방법은 연구가설에서 사전확률이 확립되어 있지 않을 경우, 사전확률을 설정하는 문제가 본래 분석하고자 하는 연구가설 검정보다 오히려 더 복잡할 수 있다. 그렇기 때문에 일반 연구자들이 접근하기에는 많은 한계를 지닌다. 최근, 다수의 연구에서 빈도주의적 방법과 베이지안 방법을 적용하여 네트워크 메타분석을 실행한 결과가 다르지 않음을 보여준다.


7.1.2 네트워크 메타분석의 기본 원리


7.1.2.1 간접비교

일반적인 메타분석(pairwise meta-analysis)에서는 두 치료그룹 간의 직접비교(direct comparison)에 따른 효과크기(effect size)를 여러 연구에서 종합하여 계산하였다. 그러나 둘 이상의 치료그룹에서 특정 치료간의 직접비교가 없을 경우에는 간접비교를 사용하여 이를 계산할 수 있다. 특히 공통 비교인자 (common comparator)를 통한 간접비교를 보정된 간접비교(adjusted indirect treatment comparison, AITC)라고 하는데, 이는 네트워크 메타분석을 가능하게 해주는 기본적인 원리이다.

예를 들어, 치료(treatment)는 3개(A, B, C)이고 2개의 연구(AB, AC)가 있으며 각각의 효과크기는 d_AB와 d_AC이다. A를 공통비교인자로 설정하여 2개의 직접비교 효과크기를 활용하여 BC의 간접비교(AITC)를 계산한 효과크기와 분산은 다음과 같다.

7.1.2.2 혼합비교

아래 그림과 같이 3개 치료 그룹 간의 직접비교 연구가 있는 경우에는 닫힌 loop를 형성하고 있기 때문에 직접비교와 간접비교(AITC)를 종합한 혼합비교(mixed treatment comparison, MTC)를 계산할 수 있다. 혼합비교는 Lumley(2002)가 2-arm trials에서 활용 가능한 방법을 제시하였고 이를 바탕으로 Higgins et al., (2012)와 White et al., (2012) 등이 multi-arm trials로 발전시켰다. 혼합비교는 연구의 정밀성(precision)을 향상시킬 수 있으며 직접비교만을 활용한 연구보다 신뢰구간(confidence interval)을 더 좁게 나타낼 수 있다.


7.1.3 네트워크 메타분석의 가정

메타분석은 기본적으로 여러 연구들을 수리적으로 종합하는 통계적 방법론이기 때문에 사전에 여러 가정(assumption)들을 충족해야만 종합효과크기(overall effect size)의 타당성을 보여줄 수 있다. 더욱이 2개 이상의 치료를 연결하는 네트워크 메타분석의 경우에는 보다 엄격한 가정이 요구된다.

네트워크 메타분석의 가정은 크게 임상석 유사성(clinical similarity), 통계적 동질성(statistical non-heterogeneity), 논리적 이행성(transitivity), 그리고 효과크기들의 일관성(consistency)으로 구분할 수 있다. 특히 주요 논문들에서는 임상적 의미가 있는 연구들을 수집하였는지 확인하는 임상적 유사성과 통계적 검정이 가능한 일관성을 중점적으로 다루고 있다.

메타분석은 태생적으로 이질성 논쟁을 피할 수 없다. 따라서 동일 연구디자인 내에서라면 임상적 유사성 검정을 위하여 Cochrane 통계량이나 Higgins 등의 이질성 수치를 활용할 수 있다. 그러나 이것은 비단 네트워크 메타분석에서뿐만 아니라 일반적인 메타분석에서와 동일한 논쟁이므로 크게 차별점이 없다. 더욱이 네트워크 메타분석에서는 여러 치료법과 여러 연구디자인을 아울러야 하므로 결국 이행성을 검정하기 위한 일관성 가정이 초점이 되고 있다. 다시말하면, ‘일관성’이란 직접비교와 간접비교를 수렴하기 위한 특수한 경우의 이질성(special type of heterogeneity)이라고 할 수 있다. 따라서 이를 검정함으로써 네트워크 메타분석 결과의 유의함을 보여주고자 하는 것이다.


7.1.3.1 유사성(similarity)

대상 연구들 간의 임상적, 방법론적 유사성을 나타내는 것이다. 일반적으로 PICO (population, Intervention, Comparison, Outcomes)를 통하여 대상연구 선정의 전체적인 흐름을 파악하게 되는데 대상연구들이 연구주제와 부합하며 전반적으로 임상적, 방법론적으로 유사하여야 한다. 예를 들면, 대상연구들 중에서 인구집단(population) 내 동일한 질환군을 대상으로 실시한 연구가 아니라면 유사성을 의심하여야 한다. 그러나 임상적 유사성은 연구의 전반적인 유사성이지 통계적으로 검정할 수 있는 것은 아니다.


7.1.3.2 이행성(transitivity)

임상적, 방법론적 유사성이 치료그룹과 연구들 간에 있어서 논리적으로 확장된 개념이라고 할 수 있다. 간단히 설명하자면 만약 세 가지 치료(A, B, C)를 비교한 연구의 효과크기가 \(A>B\) 그리고 \(B>C\) 라면 \(A>C\)가 논리적으로 타당한 것이다. 이러한 논리적 이행성은 네트워크 메타분석 내 모든 경우에서 지켜져야 한다.

앞서 살펴본 유사성과 이행성은 개념적으로 비슷하지만 상호 동일한 것은 아니다. 예를 들어 3개의 연구가 고혈압 환자 중에서 각각 AB는 severe군, AC는 moderate군, 그리고 BC는 mild군을 대상으로 실시되어졌다고 가정해보자. 모든 연구가 고혈압이라는 특정 인구집단이기에 임상적 유사성은 만족할지라도 논리적 이행성 가정은 성립되지 않는다. 왜냐하면 이미 개별연구 인구집단별로 효과크기의 차별이 존재하기 때문이다.


7.1.3.3 일관성(consistency)

기본적으로 일관성은 혼합비교를 구현함에 있어서 직접비교와 간접비교를 통한 효과크기가 동일하다는 가정이다. 예를 들어 관심효과크기가 BC라면 우선 직접비교를 통한 효과크기 \(d_{BC}\)와 간접비교를 통한 효과크기 \(d_{BC}\)는 통계적으로 유의한 차이를 보이지 않아야 일관성 가정이 충족된다고 볼 수 있다. 또한 일관성 검정은 논리적 이행성 가정을 검정하는 통계적인 방법이라고도 할 수 있다.

Higgins는 multi-arm 네트워크 메타분석에 적용 가능한 비일관성(inconsistency, 즉 일관성을 보이지 않는 여러 경우) 모델에 대한 개념을 다음과 같이 두 가지로 폭넓게 정립하였다. 첫째, 혼합비교를 계산할 때 직접비교와 간접비교의 차이를(difference) 들 수 있는데, 이를 loof inconsistency라고 한다. 둘째 동일하게 관심 효과크기가 BC라면 연구디자인 (BC, ABC)에 따른 (difference)를 들 수 있는데, BC 디자인에서의 직접비교 값인 \(d_{BC}\)와 ABC 디자인에서의 직접비교 값인 \(d_{BC}\)의 차이를 design inconsistency라고 한다.


7.2 PRISMA 네트워크 메타분석 체크리스트

일반적인 메타분석(pairwise meta-analysis)을 확장한 개념인 PRISMA (preferred Reporting Items for Systematic Reviews and Meta-analyses) 네트워크 메타분석 체크리스트는 (Hutton et al., 2015) 기존 메타분석에 더하여 네트워크 메타분석에 추가적으로 요구되는 항목들을 잘 기술하고 있다. 1번 title에서부터 연구에 대한 이해관계를 규정한 27번 funding 항목까지 매우 상세히 설명하고 있어 네트워크 메타분석 연구를 실시하고자 하는 연구자들은 반드시 이를 참조하여야 한다. 본 연구에서는 이들 항목 중 특히 네트워크 메타분석에서 반드시 보고되어야 하는 항목들은 다음과 같다.


7.2.1 네트워크 지형도

네트워크 지형도(network geometry)는 네트워크 메타분석에서 비교군 간의 관계를 도식화한 것이다. 네트워크 지형도의 질적 기술(qualitative description)은 일반적으로 네트워크 그래프(map or plot)로, 양적관계(quantitative metrics)는 각 치료별 가중값을 보여주는 기여도 그림(contribution plot)으로 보여주는 것이 일반적이다.


7.2.2 일관성 검정(assessment of consistency)

네트워크 메타분석의 기본 가정인 일관성을 검정하는 방법으로 두 가지 방법이 있다. 첫 번째 개별 치료별 접근(local approach)은 Bucher가 제시한 방법을 활용하여 각 치료별로 짝지어서(node-splitting) 직접비교와 간접비교의 차이를 통계적으로 검정하는 것이다. 두 번째 전체 모델별 접근(global approach)은 design by treatment interaction model을 사용하여 각각의 연구디자인별 비일관성 모델의 회귀계수를 계산한 후 Wald test로 전체 모델에 대한 회귀계수들의 선형성을 검정하는 것이다.


7.2.3 치료법 간의 비교우위 선정

네트워크 메타분석의 유용한 장점 중의 하나는 각 치료별 누적확률(cumulative probability)을 활용하여 치료법 간의 비교 우선순위를 산출할 수 있다는 것이다. 일반적으로 SUCRA(surface under the cumulative ranking) 곡선으로 나타내어지며, 각 치료별로 best에서부터 worst까지 확률을 도식화하여 곡선 아래 면적이 넓을수록 우선순위가 높다고 판단할 수 있다.


7.3 이산형 자료 예제


7.3.1 자료의 입력

bin_nma <- read.table(text='
study   d   n   trt
"Alshryda 2013" 10  80  D
"Alshryda 2013" 26  81  A
"Barrachina 2016"   4   36  C
"Barrachina 2016"   14  37  A
"Benoni 2000"   9   20  C
"Benoni 2000"   15  19  A
"Benoni 2001"   4   18  B
"Benoni 2001"   8   20  A
"Claeys 2007"   1   20  B
"Claeys 2007"   6   20  A
"Fraval 2017"   1   50  C
"Fraval 2017"   6   51  A
"Husted 2003"   2   20  C
"Husted 2003"   7   20  A
"Hsu 2015"  2   30  C
"Hsu 2015"  9   30  A
"Johansson 2005"    8   47  B
"Johansson 2005"    23  53  A
"Kazemi 2010"   7   32  B
"Kazemi 2010"   15  32  A
"Lee 2013"  9   34  C
"Lee 2013"  20  34  A
"Lemay 2004"    6   20  C
"Lemay 2004"    13  19  A
"Martin 2014"   3   25  D
"Martin 2014"   5   25  A
"Niskanen 2005" 5   19  C
"Niskanen 2005" 8   20  A
"North 2016"    8   70  C
"North 2016"    12  69  D
"Rajesparan 2009"   3   36  B
"Rajesparan 2009"   10  37  A
"Wang 2016" 9   81  B
"Wang 2016" 10  38  A
"Wei 2014"  6   101 B
"Wei 2014"  26  100 A
"Xie 2016"  3   70  B
"Xie 2016"  4   70  D
"Xie 2016"  0   70  E
"Yi 2016"   8   50  B
"Yi 2016"   1   50  E
"Yi 2016"   19  50  A
"Yue 2014"  3   52  D
"Yue 2014"  11  49  A
', header=T)

bin_nma
##              study  d   n trt
## 1    Alshryda 2013 10  80   D
## 2    Alshryda 2013 26  81   A
## 3  Barrachina 2016  4  36   C
## 4  Barrachina 2016 14  37   A
## 5      Benoni 2000  9  20   C
## 6      Benoni 2000 15  19   A
## 7      Benoni 2001  4  18   B
## 8      Benoni 2001  8  20   A
## 9      Claeys 2007  1  20   B
## 10     Claeys 2007  6  20   A
## 11     Fraval 2017  1  50   C
## 12     Fraval 2017  6  51   A
## 13     Husted 2003  2  20   C
## 14     Husted 2003  7  20   A
## 15        Hsu 2015  2  30   C
## 16        Hsu 2015  9  30   A
## 17  Johansson 2005  8  47   B
## 18  Johansson 2005 23  53   A
## 19     Kazemi 2010  7  32   B
## 20     Kazemi 2010 15  32   A
## 21        Lee 2013  9  34   C
## 22        Lee 2013 20  34   A
## 23      Lemay 2004  6  20   C
## 24      Lemay 2004 13  19   A
## 25     Martin 2014  3  25   D
## 26     Martin 2014  5  25   A
## 27   Niskanen 2005  5  19   C
## 28   Niskanen 2005  8  20   A
## 29      North 2016  8  70   C
## 30      North 2016 12  69   D
## 31 Rajesparan 2009  3  36   B
## 32 Rajesparan 2009 10  37   A
## 33       Wang 2016  9  81   B
## 34       Wang 2016 10  38   A
## 35        Wei 2014  6 101   B
## 36        Wei 2014 26 100   A
## 37        Xie 2016  3  70   B
## 38        Xie 2016  4  70   D
## 39        Xie 2016  0  70   E
## 40         Yi 2016  8  50   B
## 41         Yi 2016  1  50   E
## 42         Yi 2016 19  50   A
## 43        Yue 2014  3  52   D
## 44        Yue 2014 11  49   A


베이지안 네트워크 메타분석을 실행하기 위해 gemtc 패키지를 이용한다. 또한 MCMC를 위해 JAGS를 이용하므로 JAGS(http://mcmc-jags.sourceforge.net/) 프로그램을 별도로 설치해야 한다.

#install.packages("gemtc")
library(gemtc)
## Loading required package: coda
## 
## Attaching package: 'gemtc'
## The following object is masked from 'package:dmetar':
## 
##     sucra
## The following object is masked from 'package:meta':
## 
##     forest

gemtc package는 여러 함수를 포함하고 있으며, 그 중 네트워크 분석을 실행하는 mtc.network 함수는 함수의 인수가 특정 변수명이어야 실행 가능하다. 이산형 자료에서는 순서대로 이벤트 수를 나타내는 “responders”와 표본크기인 “sampleSize” 변수명이 일치해야 한다. 따라서 이를 위해 column 명을 변경한다.

colnames(bin_nma) <- c("study", "responders", "sampleSize", "treatment")

colnames(bin_nma)
## [1] "study"      "responders" "sampleSize" "treatment"

다음으로 네트워크 plot에서 treatment를 상세히 보여주고 이를 네트워크 셋업으로 활용하기 위해 treatment 데이터셋을 설정한다.

  treatment <- read.table(text='
                          id description
                          A "Placebo"
                          B "IV(single)"
                          C "IV(double)"
                          D "Topical"
                          E "Combination"
                          ', header=T) 


7.3.2 네트워크 plot

데이터셋 bin_nma와 treatment를 이용하여 네트워크 셋업을 시행한다. 이때 함수는 mtc.network를 이용한다.

network <- mtc.network(data.ab=bin_nma, treatments=treatment, description="Bayesian NMA")

셋업된 네트워크 정보를 network에 저장하고 plot 함수를 이용해 간단하게 네트워크 plot을 출력한다.

 plot(network, use.description=T)

네트워크 plot은 네트워크를 구성하는 치료그룹 간의 직접비교(direct comparison) 관계를 도식화해서 보여준다. 각 node를 연결하는 엣지(edge)의 굵기는 수행된 연구 수를 의미한다. 네트워크 plot은 네트워크 메타분석 연구에서 치료 간의 질적, 양적 관계를 가늠할 수 있게 해주므로 반드시 제시되어야 한다.

library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
plot(network, layout=igraph::layout.fruchterman.reingold, use.description=T)

위의 예제와 같이 igraph 패키지를 이용하면 네트워크 plot을 좀 더 다양하게 표현하는 것이 가능하다.

 summary(network)
## $Description
## [1] "MTC dataset: Bayesian NMA"
## 
## $`Studies per treatment`
##  A  B  C  D  E 
## 19  9  9  5  2 
## 
## $`Number of n-arm studies`
## 2-arm 3-arm 
##    19     2 
## 
## $`Studies per treatment comparison`
##   t1 t2 nr
## 1  A  B  8
## 2  A  C  8
## 3  A  D  3
## 4  A  E  1
## 5  B  D  1
## 6  B  E  2
## 7  C  D  1
## 8  D  E  1

summary 명령어를 실시하면 결과창에서 네트워크 셋업의 전반적인 상황을 볼 수 있다. 각 치료별 2-arm 또는 3-arm 연구의 개수와 치료별 대응개수도 알 수 있다. 즉, 네트워크 plot을 수치적으로 나타낸 결과이다.


7.3.3 네트워크 모델

네트워크 셋업 후 고정효과모형(fixed effect model) 또는 랜덤효과모형(random effect model)으로 네트워크 모델을 설정한다. 이때 함수 mtc.model을 이용한다.

  model_fix <- mtc.model(network, linearModel='fixed', n.chain=4, likelihood='binom', link='logit') # Fixed effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

mtc.model 함수에 네트워크 셋업 데이터 network를 불러들여 고정효과모형 또는 랜덤효과모형으로 설정하여 각각 model_fix와 model_ran으로 저장한다. 여기서 n.chain은 MCMC에서 사용할 chain 수를 나타낸다.

  model_ran <- mtc.model(network, linearModel='random', n.chain=4, likelihood='binom', link='logit') # Random effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

motc.model에서 효과크기 설정은 likelihood와 link 옵션으로 조절하며, 효과크기 종류와 매칭시켜야 하는 변수명은 다음과 같다.

  • Odds ratio: binom/logit, (responders, sampleSize)
  • Risk ratio: binom/log (responders, sampleSize)
  • Hazard ratio: binom/cloglog, (responders, sampleSize)
  • Hazard ratio: poisson/log, (responders, exposure)


7.3.4 MCMC 시물레이션과 진단

7.3.4.1 MCMC 시뮬레이션 실행

네트워크 모델이 설정되면 MCMC 시뮬레이션을 실시한다. 전반적인 순서는 적정 수준의 시뮬레이션 횟수를 설정하여 실행하고 실행한 결과들의 수렴 여부를 확인한다. 먼저 고정효과모형을 중심으로 살펴보자. MCMC 시물레이션은 mtc.run 함수를 사용한다.

  ###### MCMC Simulation
mcmc_fix <- mtc.run(model_fix, n.adapt=1000, n.iter=10000, thin=10)
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 44
##    Unobserved stochastic nodes: 25
##    Total graph size: 860
## 
## Initializing model

여기서 n.adapt=1000은 MCMC를 통해 추출된 난수중 초기값에 영향을 받는 처음부터 1000번까지는 버리는다는 의미이다. n.iter=10000은 n.adapt에서 제거한 난수 이후에 생성되는 난수의 수를 의미하며 thin은 10번의 간격으로 생성난 난수를 추출한다는 의미이다. 따라서 총 난수는 1번부터 11000번까지 생성되며, 그중에서 1~1000번까지의 난수는 버리게 되며, 1001번부터 11000까지의 난수 중 1010, 1020, … 과 같은 순으로 난수가 추출된다.

베이지안 분석에서는 사후분포(posterior distribution)를 결정하기 위해 다중연쇄(multi chain)를 고려한 사전분포(prior distribution)을 넣어주는데, 이때 사전분포를 계산하기 위한 사전분포의 사전모수, 즉 초모수(hyperparameter)의 초기값을 다중으로 설정하여 다중연쇄 시뮬레이션을 실시한다. 총 10000개의 난수 중 10번 간격으로 추출하는 것이기 때문에 각 chain별로 1000개씩의 난수를 추출하게 된다. MCMC 수행 결과는 summary 함수를 통해 살펴볼 수 있다.

  summary(mcmc_fix)
## 
## Results on the Log Odds Ratio scale
## 
## Iterations = 1010:11000
## Thinning interval = 10 
## Number of chains = 4 
## Sample size per chain = 1000 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##         Mean     SD Naive SE Time-series SE
## d.A.B -1.338 0.1950 0.003083       0.003056
## d.A.C -1.525 0.2317 0.003664       0.003782
## d.A.D -1.130 0.2613 0.004131       0.004191
## d.A.E -4.379 1.3040 0.020617       0.021048
## 
## 2. Quantiles for each variable:
## 
##         2.5%    25%    50%     75%   97.5%
## d.A.B -1.727 -1.466 -1.334 -1.2099 -0.9679
## d.A.C -1.975 -1.683 -1.524 -1.3709 -1.0722
## d.A.D -1.649 -1.305 -1.125 -0.9516 -0.6238
## d.A.E -7.484 -5.077 -4.163 -3.4743 -2.4176
## 
## -- Model fit (residual deviance):
## 
##     Dbar       pD      DIC 
## 30.95278 25.38918 56.34196 
## 
## 44 data points, ratio 0.7035, I^2 = 0%


7.3.4.2 MCMC 시뮬레이션 진단

MCMC 시뮬레이션이 잘 수행되었는지 확인하기 위해서 아래 사항들을 복합적으로 확인한다.

  • MCMC error : 몬테카를로 오차(Naive SE & Time-series SE)는 작을수록 높은 정밀도를 나타내어 수렴이 잘 되었다고 판단할 수 있다. 시뮬레이션의 전반적인 평가는 MCMC error 가 얼마나 최소화되는가에 달려 있다고 볼 수 있다. 따라서 반복 시뮬레이션 획수를 늘려 표본의 수를 충분히 확보하고 초기값의 영향을 제거하기 위해 burn-in 과정을 거치며 난수 추출간격 thin을 잘 조정해야 한다.

  • DIC (deviance information criterion) : \(DIC = \bar{D} + pD\)로 표현된다 \(\bar{D}\)는 잔차이탈도(residual deviance)의 합이며 \(pD\)는 모수 수의 추정값으로 결국 DIC는 모형의 적합도와 복잡성을 동시에 고려한 수치이다. 이 수치가 작을수록 좀 더 나은 모형이라고 할 수 있다.

  • trace plot과 density plot : trace plot은 특정한 패턴 없이 각 chain들이 얽혀 있어야 잘 수렴했다고 판단할 수 있다. density plot은 사후분포(사후밀도함수)로서 시뮬레이션 반복횟수에 따라 모양이 크게 다르다면 잘 수렴하지 않았다는 것을 의미한다.

  plot(mcmc_fix)

  • 겔만-루빈(Gelman-Rubin) 통계량과 plot
  ###### Gelman-Rubin Statistics and plot
  gelman.diag(mcmc_fix)
## Potential scale reduction factors:
## 
##       Point est. Upper C.I.
## d.A.B          1          1
## d.A.C          1          1
## d.A.D          1          1
## d.A.E          1          1
## 
## Multivariate psrf
## 
## 1
  gelman.plot(mcmc_fix)

gelman.diag 함수는 겔만-루빈 통계량을 구해주며, gelman.plot은 겔만-루빈 plot을 그려준다. 시뮬레이션 반복횟수가 커짐에 따라 1에 가깝게 나타나며 변동이 안정화되어야 잘 수렵했다고 할 수 있다.


7.3.5 일관성 검정(consistency test)

네트워크 메타분석의 가정에서 일관성 검정은 네트워크 메타분석 결과의 적용 가능 여부를 판가름하는 매우 중요한 도구이다.

  ###### Consistency test
    node_fix <- mtc.nodesplit(network, linearModel='fixed',   n.adapt=1000, n.iter=10000, thin=10)
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 43
##    Unobserved stochastic nodes: 26
##    Total graph size: 937
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 44
##    Unobserved stochastic nodes: 26
##    Total graph size: 952
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 44
##    Unobserved stochastic nodes: 26
##    Total graph size: 949
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 43
##    Unobserved stochastic nodes: 26
##    Total graph size: 935
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 43
##    Unobserved stochastic nodes: 26
##    Total graph size: 931
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 44
##    Unobserved stochastic nodes: 26
##    Total graph size: 948
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 43
##    Unobserved stochastic nodes: 26
##    Total graph size: 931
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 44
##    Unobserved stochastic nodes: 25
##    Total graph size: 860
## 
## Initializing model
#   plot(node_fix)
  plot(summary(node_fix))

mtc.nodesplit 함수에 네트워크 셋입 자료를 넣어서 일관성 검정을 위한 고정효과모형 모델 node_fix를 만든다. 이때 MCMC 시뮬레이션도 같이 시행된다. 치료 간의 변동을 시각적으로 쉽게 파악할 수 있으며 모든 개별 치료 간의 일관성 검정 결과를 쉽게 파악할 수 있다. 전체적으로 통계적 유의차를 보이지 않아 해당 모델은 일관성을 지지하는 것으로 나타난다.


7.3.6 Forest plot

네트워크 메타분석을 통해 치료그룹별 효과크기를 한눈에 알아볼 수 있도록 도식화하여 비교한다.

  ###### Forest plot
    forest(relative.effect(mcmc_fix,t1="A"), digits=3)

relative.effect 함수를 통해 치료 그룹간 효과크기를 추출하고 이를 forest 함수를 통해 forest plot을 그린다. relative.effect 함수의 인수중 t1에 “A”를 넣으면 참조치료를 A로 하는 forest plot을 생성한다.

  ###### Forest plot
    forest(relative.effect(mcmc_fix,t1="E"), digits=3)

Forest plot을 통해 각 치료별 효과크기를 직관적으로 비교할 수 있다. Placebo에 대비한 모든 치료별 효과크기(OR, 수혈률)가 낮게 나타났으며 \(95\%\) 신용구간(credible interval)이 겹치지 않는다는 것을 알 수 있다. 특히 병용치료방법(E, combination)의 경우 placebo뿐만 아니라 정맥1회주사법(B, IV(single)), 정맥2회주사법(C, IV(double)), 국소도포법(D, topical) 등 모든 치료에 대비하여 통계적으로 유의하게 수혈률이 낮음을 알 수 있다. 참조치료를 E로 변경하면 반대로 해석할 수 있다.


7.3.7 치료 간 비교우위 선정(treatment ranking)

네트워크 메타분석의 가장 중요한 기능 중의 하나는 치료 간 비교우위를 선정할 수 있다는 것이다. 다시 말해 치료별 최우선 순위에서 최하위 순위까지 선택될 누적확률을 계산할 수 있다.

rank.probability 함수에 MCMC 최종 모형을 넣고, preferredDirection은 효과크기가 작을수록 우수한 것인지 클수록 우수한 것인지에 따라 ‘-1’ 또는 ‘1’ 중에서 방향을 설정한다. 예제에서는 참조치료 대비 효과크기가 작을수록 우수한 것이기 때문에 ’-1’을 설정한다.

  ###### Treatment ranking
    rank_fix <- rank.probability(mcmc_fix, preferredDirection=-1)
    rank_fix
## Rank probability; preferred direction = -1
##    [,1]    [,2]    [,3]    [,4] [,5]
## A 0.000 0.00000 0.00000 0.00000    1
## B 0.000 0.25300 0.52175 0.22525    0
## C 0.001 0.68925 0.25200 0.05775    0
## D 0.000 0.05675 0.22625 0.71700    0
## E 0.999 0.00100 0.00000 0.00000    0

결과를 살펴보면 E(combination)이 best 치료일 경우는 99.8%이다. 2순위로 선택될 치료로는 C(IV double)가 68.2%이며, 다음으로는 B(IV single), D(topical), A(placebo)의 순위를 보인다.

치료간 우위를 그래프로 표현하면 다음과 같다.

    plot(rank_fix, beside=T)


7.4 연속형 자료 예제


7.4.1 자료의 입력

con_nma <- read.table(text='
study   n   m   s   trt
"Alshryda 2013" 80  1650    188 D
"Alshryda 2013" 81  1981    1007    A
"Barrachina 2016"   36  1308    641 C
"Barrachina 2016"   37  2215    1136    A
"Benoni 2000"   20  550 275 C
"Benoni 2000"   19  500 234 A
"Benoni 2001"   18  759 193 B
"Benoni 2001"   20  996 267 A
"Ekbck 2000"    20  1130    400 C
"Ekbck 2000"    20  1770    523 A
"Fraval 2017"   50  1084    440 C
"Fraval 2017"   51  1394    426 A
"Garneti 2004"  25  1443    809 B
"Garneti 2004"  25  1340    665 A
"Johansson 2005"    47  969 434 B
"Johansson 2005"    53  1324    577 A
"Lemay 2004"    20  1308    462 C
"Lemay 2004"    19  1469    405 A
"Lee 2013"  34  647 216 C
"Lee 2013"  34  1326    349 A
"Niskanen 2005" 19  626 206 C
"Niskanen 2005" 20  790 293 A
"North 2016"    70  1195    485.9   C
"North 2016"    69  1442.7  562.7   D
"Rajesparan 2009"   36  1372    436 B
"Rajesparan 2009"   37  1683    705 A
"Wei 2014"  101 958.5   422.1   B
"Wei 2014"  102 963.4   421.3   D
"Wei 2014"  100 1364.2  278.6   A
"Yi 2016"   50  1002.6  366.9   B
"Yi 2016"   50  750.6   343.5   E
"Yi 2016"   50  1221.1  386.3   A
"Xie 2016"  70  878 210 B
"Xie 2016"  70  905.07  237.7   D
"Xie 2016"  70  670.7   189 E
"Yamasaki 2004" 20  1350    477 B
"Yamasaki 2004" 20  1667    401 A
"Yue 2014"  52  1050.3  331.7   D
"Yue 2014"  49  1255.5  193.5   A
', header=T)

con_nma
##              study   n       m      s trt
## 1    Alshryda 2013  80 1650.00  188.0   D
## 2    Alshryda 2013  81 1981.00 1007.0   A
## 3  Barrachina 2016  36 1308.00  641.0   C
## 4  Barrachina 2016  37 2215.00 1136.0   A
## 5      Benoni 2000  20  550.00  275.0   C
## 6      Benoni 2000  19  500.00  234.0   A
## 7      Benoni 2001  18  759.00  193.0   B
## 8      Benoni 2001  20  996.00  267.0   A
## 9       Ekbck 2000  20 1130.00  400.0   C
## 10      Ekbck 2000  20 1770.00  523.0   A
## 11     Fraval 2017  50 1084.00  440.0   C
## 12     Fraval 2017  51 1394.00  426.0   A
## 13    Garneti 2004  25 1443.00  809.0   B
## 14    Garneti 2004  25 1340.00  665.0   A
## 15  Johansson 2005  47  969.00  434.0   B
## 16  Johansson 2005  53 1324.00  577.0   A
## 17      Lemay 2004  20 1308.00  462.0   C
## 18      Lemay 2004  19 1469.00  405.0   A
## 19        Lee 2013  34  647.00  216.0   C
## 20        Lee 2013  34 1326.00  349.0   A
## 21   Niskanen 2005  19  626.00  206.0   C
## 22   Niskanen 2005  20  790.00  293.0   A
## 23      North 2016  70 1195.00  485.9   C
## 24      North 2016  69 1442.70  562.7   D
## 25 Rajesparan 2009  36 1372.00  436.0   B
## 26 Rajesparan 2009  37 1683.00  705.0   A
## 27        Wei 2014 101  958.50  422.1   B
## 28        Wei 2014 102  963.40  421.3   D
## 29        Wei 2014 100 1364.20  278.6   A
## 30         Yi 2016  50 1002.60  366.9   B
## 31         Yi 2016  50  750.60  343.5   E
## 32         Yi 2016  50 1221.10  386.3   A
## 33        Xie 2016  70  878.00  210.0   B
## 34        Xie 2016  70  905.07  237.7   D
## 35        Xie 2016  70  670.70  189.0   E
## 36   Yamasaki 2004  20 1350.00  477.0   B
## 37   Yamasaki 2004  20 1667.00  401.0   A
## 38        Yue 2014  52 1050.30  331.7   D
## 39        Yue 2014  49 1255.50  193.5   A


베이지안 네트워크 메타분석을 실행하기 위해 gemtc 패키지를 이용한다. 또한 MCMC를 위해 JAGS를 이용하므로 JAGS(http://mcmc-jags.sourceforge.net/) 프로그램을 별도로 설치해야 한다.

#install.packages("gemtc")
library(gemtc)

gemtc package는 여러 함수를 포함하고 있으며, 그 중 네트워크 분석을 실행하는 mtc.network 함수는 함수의 인수가 특정 변수명이어야 실행 가능하다. 연속형 자료에서는 순서대로 “sampleSize”, “mean”, “std.dev”가 일치해야 한다. 따라서 이를 위해 column 명을 변경한다.

colnames(con_nma) <- c("study", "sampleSize", "mean", "std.dev", "treatment")

colnames(con_nma)
## [1] "study"      "sampleSize" "mean"       "std.dev"    "treatment"

다음으로 네트워크 plot에서 treatment를 상세히 보여주고 이를 네트워크 셋업으로 활용하기 위해 treatment 데이터셋을 설정한다.

  treatment <- read.table(text='
                          id description
                          A "Treatment A"
                          B "Treatment B"
                          C "Treatment C"
                          D "Treatment D"
                          E "Treatment E"
                          ', header=T) 


7.4.2 네트워크 plot

데이터셋 con_nma와 treatment를 이용하여 네트워크 셋업을 시행한다. 이때 함수는 mtc.network를 이용한다.

network <- mtc.network(data.ab=con_nma, treatments=treatment, description="Bayesian NMA")

셋업된 네트워크 정보를 network에 저장하고 plot 함수를 이용해 간단하게 네트워크 plot을 출력한다.

 plot(network, use.description=T)

네트워크 plot은 네트워크를 구성하는 치료그룹 간의 직접비교(direct comparison) 관계를 도식화해서 보여준다. 각 node를 연결하는 엣지(edge)의 굵기는 수행된 연구 수를 의미한다. 네트워크 plot은 네트워크 메타분석 연구에서 치료 간의 질적, 양적 관계를 가늠할 수 있게 해주므로 반드시 제시되어야 한다.

 summary(network)
## $Description
## [1] "MTC dataset: Bayesian NMA"
## 
## $`Studies per treatment`
##  A  B  C  D  E 
## 16  8  8  5  2 
## 
## $`Number of n-arm studies`
## 2-arm 3-arm 
##    15     3 
## 
## $`Studies per treatment comparison`
##   t1 t2 nr
## 1  A  B  7
## 2  A  C  7
## 3  A  D  3
## 4  A  E  1
## 5  B  D  2
## 6  B  E  2
## 7  C  D  1
## 8  D  E  1

summary 명령어를 실시하면 결과창에서 네트워크 셋업의 전반적인 상황을 볼 수 있다. 각 치료별 2-arm 또는 3-arm 연구의 개수와 치료별 대응개수도 알 수 있다. 즉, 네트워크 plot을 수치적으로 나타낸 결과이다.


7.4.3 네트워크 모델

네트워크 셋업 후 고정효과모형 또는 랜덤효과모형으로 네트워크 모델을 설정한다. 이때 함수 mtc.model을 이용한다.

  model_fix <- mtc.model(network, linearModel='fixed', n.chain=4, likelihood='normal', link='identity') # Fixed effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

mtc.model 함수에 네트워크 셋업 데이터 network를 불러들여 고정효과모형 또는 랜덤효과모형으로 설정하여 각각 model_fix와 model_ran으로 저장한다. 여기서 n.chain은 MCMC에서 사용할 chain 수를 나타낸다.

  model_ran <- mtc.model(network, linearModel='random', n.chain=4, likelihood='normal', link='identity') # Random effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다


7.4.4 MCMC 시물레이션과 진단

7.4.4.1 MCMC 시뮬레이션 실행

네트워크 모델이 설정되면 MCMC 시뮬레이션을 실시한다. 전반적인 순서는 적정 수준의 시뮬레이션 횟수를 설정하여 실행하고 실행한 결과들의 수렴 여부를 확인한다. 먼저 고정효과모형을 중심으로 살펴보자. MCMC 시물레이션은 mtc.run 함수를 사용한다.

  ###### MCMC Simulation
mcmc_fix <- mtc.run(model_fix, n.adapt=1000, n.iter=10000, thin=10)
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 39
##    Unobserved stochastic nodes: 22
##    Total graph size: 454
## 
## Initializing model

여기서 n.adapt=1000은 MCMC를 통해 추출된 난수중 초기값에 영향을 받는 처음부터 1000번까지는 버리는다는 의미이다. n.iter=10000은 n.adapt에서 제거한 난수 이후에 생성되는 난수의 수를 의미하며 thin은 10번의 간격으로 생성난 난수를 추출한다는 의미이다. 따라서 총 난수는 1번부터 11000번까지 생성되며, 그중에서 1~1000번까지의 난수는 버리게 되며, 1001번부터 11000까지의 난수 중 1010, 1020, … 과 같은 순으로 난수가 추출된다. MCMC 수행 결과는 summary 함수를 통해 살펴볼 수 있다.

  summary(mcmc_fix)
## 
## Results on the Mean Difference scale
## 
## Iterations = 10:10000
## Thinning interval = 10 
## Number of chains = 4 
## Sample size per chain = 1000 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##         Mean    SD Naive SE Time-series SE
## d.A.B -302.4 28.25   0.4466         0.4717
## d.A.C -360.8 34.31   0.5425         0.5539
## d.A.D -275.6 28.41   0.4492         0.4795
## d.A.E -510.6 34.76   0.5496         0.5722
## 
## 2. Quantiles for each variable:
## 
##         2.5%    25%    50%    75%  97.5%
## d.A.B -358.7 -320.7 -303.0 -283.4 -248.1
## d.A.C -426.5 -383.5 -360.9 -337.6 -294.6
## d.A.D -330.6 -294.9 -275.7 -256.6 -218.3
## d.A.E -579.8 -534.3 -510.2 -487.3 -443.6
## 
## -- Model fit (residual deviance):
## 
##      Dbar        pD       DIC 
## 105.68179  22.16494 127.84673 
## 
## 39 data points, ratio 2.71, I^2 = 64%


7.4.4.2 MCMC 시뮬레이션 진단

  • Trace plot
  plot(mcmc_fix)

특정한 패턴 없이 각 chain들이 얽혀 있어야 잘 수렴했다고 판단할 수 있다. density plot은 사후분포(사후밀도함수)로서 시뮬레이션 반복횟수에 따라 모양이 크게 다르다면 잘 수렴하지 않았다는 것을 의미한다.

  • 겔만-루빈(Gelman-Rubin) 통계량과 plot
  ###### Gelman-Rubin Statistics and plot
  gelman.diag(mcmc_fix)
## Potential scale reduction factors:
## 
##       Point est. Upper C.I.
## d.A.B      0.999       1.00
## d.A.C      1.000       1.00
## d.A.D      1.003       1.01
## d.A.E      1.001       1.00
## 
## Multivariate psrf
## 
## 1
  gelman.plot(mcmc_fix)

gelman.diag 함수는 겔만-루빈 통계량을 구해주며, gelman.plot은 겔만-루빈 plot을 그려준다. 시뮬레이션 반복횟수가 커짐에 따라 1에 가깝게 나타나며 변동이 안정화되어야 잘 수렵했다고 할 수 있다.


7.4.5 일관성 검정(consistency test)

네트워크 메타분석의 가정에서 일관성 검정은 네트워크 메타분석 결과의 적용 가능 여부를 판가름하는 매우 중요한 도구이다.

  ###### Consistency test
    node_fix <- mtc.nodesplit(network, linearModel='fixed',   n.adapt=1000, n.iter=10000, thin=10)
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 37
##    Unobserved stochastic nodes: 23
##    Total graph size: 527
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 39
##    Unobserved stochastic nodes: 23
##    Total graph size: 545
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 38
##    Unobserved stochastic nodes: 23
##    Total graph size: 533
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 38
##    Unobserved stochastic nodes: 23
##    Total graph size: 536
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 37
##    Unobserved stochastic nodes: 23
##    Total graph size: 523
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 39
##    Unobserved stochastic nodes: 23
##    Total graph size: 541
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 38
##    Unobserved stochastic nodes: 23
##    Total graph size: 532
## 
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다

## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 39
##    Unobserved stochastic nodes: 22
##    Total graph size: 454
## 
## Initializing model
#   plot(node_fix)
  plot(summary(node_fix))

mtc.nodesplit 함수에 네트워크 셋입 자료를 넣어서 일관성 검정을 위한 고정효과모형 모델 node_fix를 만든다. 이때 MCMC 시뮬레이션도 같이 시행된다. 치료 간의 변동을 시각적으로 쉽게 파악할 수 있으며 모든 개별 치료 간의 일관성 검정 결과를 쉽게 파악할 수 있다. 전체적으로 통계적 유의차를 보이지 않아 해당 모델은 일관성을 지지하는 것으로 나타난다.


7.4.6 Forest plot

네트워크 메타분석을 통해 치료그룹별 효과크기를 한눈에 알아볼 수 있도록 도식화하여 비교한다.

  ###### Forest plot
    forest(relative.effect(mcmc_fix,t1="A"), digits=3)

relative.effect 함수를 통해 치료 그룹간 효과크기를 추출하고 이를 forest 함수를 통해 forest plot을 그린다. relative.effect 함수의 인수중 t1에 “A”를 넣으면 참조치료를 A로 하는 forest plot을 생성한다.


7.4.7 치료 간 비교우위 선정(treatment randing)

네트워크 메타분석의 가장 중요한 기능 중의 하나는 치료 간 비교우위를 선정할 수 있다는 것이다. 다시 말해 치료별 최우선 순위에서 최하위 순위까지 선택될 누적확률을 계산할 수 있다.

rank.probability 함수에 MCMC 최종 모형을 넣고, preferredDirection은 효과크기가 작을수록 우수한 것인지 클수록 우수한 것인지에 따라 ‘-1’ 또는 ‘1’ 중에서 방향을 설정한다. 예제에서는 참조치료 대비 효과크기가 작을수록 우수한 것이기 때문에 ’-1’을 설정한다.

  ###### Treatment ranking
    rank_fix <- rank.probability(mcmc_fix, preferredDirection=-1)
    rank_fix
## Rank probability; preferred direction = -1
##    [,1]    [,2]    [,3]    [,4] [,5]
## A 0.000 0.00000 0.00000 0.00000    1
## B 0.000 0.08775 0.74700 0.16525    0
## C 0.001 0.90300 0.07875 0.01725    0
## D 0.000 0.00825 0.17425 0.81750    0
## E 0.999 0.00100 0.00000 0.00000    0

결과를 살펴보면 Treatment E가 best 선택일 경우는 99.9%이다. 2순위로 선택될 치료로는 Treatment C이며, 다음으로는 Treatment B, D, A의 순위를 보인다.

치료간 우위를 그래프로 표현하면 다음과 같다.

    plot(rank_fix, beside=T)


7.5 Time to event 예제


생존자료의 메타분석을 위해 여기서는 BUGSnet packages (https://bugsnetsoftware.github.io/)를 이용한다(meta package도 이용 가능).

7.5.1 자료의 입력

##### install.packages("BUGSnet")
library(BUGSnet)

본 예제에서는 BUGSnet packages에 내장된 당뇨 관련 데이터인 diabetes.sim 데이터셋을 이용한다.

head(BUGSnet::diabetes.sim)
##   Study followup trtnum Treatment diabetes    n  age age_SD  age_type
## 1 MRC-E      5.8      1  Diuretic       43 1081 60.7  14.26 mean & SD
## 2 MRC-E      5.8      2   Placebo       34 2213 59.2  13.10 mean & SD
## 3 MRC-E      5.8      3   blocker       37 1102 60.2  14.00 mean & SD
## 4  EWPH      4.7      1  Diuretic       29  416 59.0  15.20 mean & SD
## 5  EWPH      4.7      2   Placebo       20  424 57.0  14.80 mean & SD
## 6  SHEP      3.0      1  Diuretic      140 1631 63.1  13.20 mean & SD

데이터를 BUGSnet에 적용하기 위해 data.prep 함수를 이용하여 변형한다.

rate2.slr <- BUGSnet::data.prep(arm.data=BUGSnet::diabetes.sim, varname.t="Treatment", varname.s="Study")


7.5.2 네트워크 plot

데이터셋 con_nma와 treatment를 이용하여 네트워크 셋업을 시행한다. 이때 함수는 net.plot를 이용한다.

BUGSnet::net.plot(rate2.slr, node.scale=3, edge.scale=1.5)

특정노드와 관련된 직접적인 근거(direct evidence)는 falg 옵션을 통해 조절한다.

BUGSnet::net.plot(rate2.slr, node.scale=3, edge.scale=1.5, flag="ARB")

그림을 살펴보면, ARB와 관련된 5개의 연구에서 4개의 treatment와 연관되어 있음을 붉은 색 엣지로 표시해준다.

네트워크 특성과 관련된 정보는 다음과 같이 확인한다.

network.char <- BUGSnet::net.tab(data=rate2.slr, outcome="diabetes", N="n", type.outcome="rate2", time="followup")
  • Network Characteristics
network.char$network
## # A tibble: 13 x 2
##    Characteristic                                        Value 
##    <chr>                                                 <chr> 
##  1 Number of Interventions                               6     
##  2 Number of Studies                                     22    
##  3 Total Number of Patients in Network                   154176
##  4 Total Possible Pairwise Comparisons                   15    
##  5 Total Number of Pairwise Comparisons With Direct Data 14    
##  6 Is the network connected?                             TRUE  
##  7 Number of Two-arm Studies                             18    
##  8 Number of Multi-Arms Studies                          4     
##  9 Total Number of Events in Network                     10962 
## 10 Number of Studies With  No Zero Events                22    
## 11 Number of Studies With At Least One Zero Event        0     
## 12 Number of Studies with All Zero Events                0     
## 13 Mean person follow up time                            4.06
  • Intervention Characterisitcs
network.char$intervention
##       Treatment n.studies n.events n.patients person.time.fup min.event.rate
## 1 ACE inhibitor         8     1618      23351          106027    0.007263184
## 2           ARB         5     1189      14185           57291    0.005102041
## 3       blocker         9     2705      36150          173098    0.005788848
## 4           CCB         9     2791      38809          163469    0.009421001
## 5      Diuretic         8      973      18699           71931    0.006032042
## 6       Placebo         9     1686      22982           89692    0.002648924
##   max.event.rate events.per.person overall.event.rate
## 1     0.05705935        0.06929039         0.01526026
## 2     0.03229521        0.08382094         0.02075370
## 3     0.04548408        0.07482711         0.01562699
## 4     0.04168838        0.07191631         0.01707357
## 5     0.04081633        0.05203487         0.01352685
## 6     0.06160242        0.07336176         0.01879766
  • Comparison Characterisitcs
network.char$comparison
## # A tibble: 14 x 7
##    comparison n.studies n.patients n.outcomes patient_time proportion event.rate
##    <chr>          <int>      <int>      <int>        <int>      <dbl>      <dbl>
##  1 ACE inhib~         3      15158       1022       409266     0.0674    0.00250
##  2 ACE inhib~         3      12597        538       289731     0.0427    0.00186
##  3 ACE inhib~         2      16488        759       263808     0.0460    0.00288
##  4 ACE inhib~         3      17893       1929       429432     0.108     0.00449
##  5 ARB vs. b~         1       7999        562        71991     0.0703    0.00781
##  6 ARB vs. C~         1      10161       1535        81288     0.151     0.0189 
##  7 ARB vs. D~         1        392          9          784     0.0230    0.0115 
##  8 ARB vs. P~         2       9778        573       127114     0.0586    0.00451
##  9 blocker v~         5      44974       3361      1933882     0.0747    0.00174
## 10 blocker v~         2       8752        241       166288     0.0275    0.00145
## 11 blocker v~         1       3315         71        36465     0.0214    0.00195
## 12 CCB vs. D~         2      15739        768       220346     0.0488    0.00349
## 13 CCB vs. P~         1       9711        331        58266     0.0341    0.00568
## 14 Diuretic ~         3       7343        384       198261     0.0523    0.00194
  • Patient Characteristics
BUGSnet::data.plot(data=rate2.slr, covariate="age", half.length="age_SD", by="treatment", avg.hline=T, text.size=12)


7.5.3 네트워크 모델

BUGSnet에서 고정효과모형 또는 랜덤효과모형 설정은 nma.model 함수를 이용한다.

  • 고정효과모형
  model_fix <- BUGSnet::nma.model(data=rate2.slr,
                         outcome="diabetes",
                         N="n",
                         reference="Diuretic",
                         family="binomial",
                         link="cloglog",
                         time="followup",
                         effects="fixed")
  • 랜덤효과모형
  model_ran <- BUGSnet::nma.model(data=rate2.slr,
                         outcome="diabetes",
                         N="n",
                         reference="Diuretic",
                         family="binomial",
                         link="cloglog",
                         time="followup",
                         effects="random")


7.5.4 MCMC 시물레이션과 진단

7.5.4.1 MCMC 시뮬레이션 실행

고정효과모형과 랜덤효과모형 실행은 nma.run 함수를 이용한다.

mcmc_fix <- BUGSnet::nma.run(model_fix,
                    n.burnin=1000,
                    n.iter=10000,
                    n.chains=4,
                    thin=10)
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 48
##    Unobserved stochastic nodes: 27
##    Total graph size: 1075
## 
## Initializing model
mcmc_ran <- BUGSnet::nma.run(model_ran,
                    n.burnin=1000,
                    n.iter=10000,
                    n.chains=4,
                    thin=10)
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 48
##    Unobserved stochastic nodes: 54
##    Total graph size: 1161
## 
## Initializing model


7.5.4.2 MCMC 시뮬레이션 진단

고정효과모형과 랜덤효과모형은 rainbow plot과 DIC를 비교하여 선택한다. Leverage plot에서 보라색선을 넘어가는 연구는 잠재적 이상값(outlier)으로 간주할 수 있고 이들도 인해 모형이 잘 적합되지 않을 수 있음을 시사한다. 이를 위한 함수는 nma.fit이다.

par(mfrow=c(1,2))
model_fit_fix <- BUGSnet::nma.fit(mcmc_fix, main="Fixed Effects Model")
model_fit_ran <- BUGSnet::nma.fit(mcmc_ran, main="Random Effects Model")

결과를 살펴보면 랜덤효과모형이 더 나은 것으로 나타난다. DIC가 91.56으로 고정효과모형의 105.2보다 낮게 나타나며, 고정효과모형에서 잠재적 이상값이 8개가 나타나 모형 적합에 영향을 주는것으로 보인다.

  • Assessment of convergence
BUGSnet::nma.diag(mcmc_ran, plot_prompt=FALSE)

## $gelman.rubin
## $psrf
##       Point est. Upper C.I.
## d[2]    1.002109   1.007768
## d[3]    1.000728   1.002008
## d[4]    1.004122   1.013641
## d[5]    1.001103   1.002895
## d[6]    1.004406   1.014873
## sigma   1.006266   1.018705
## 
## $mpsrf
## [1] 1.011114
## 
## attr(,"class")
## [1] "gelman.rubin.results"
## 
## $geweke
## $stats
##          Chain 1     Chain 2     Chain 3    Chain 4
## d[2]  -0.9101958 -0.05704727  0.02072854 -0.4751659
## d[3]  -2.4433930  0.51351266  0.87791869 -0.2783222
## d[4]  -1.9653916  0.80939042  0.27759269  0.8951323
## d[5]  -1.1672565 -0.05531920  0.23694571  0.8566209
## d[6]  -2.2243168  0.90786290  0.01508410 -0.5151987
## sigma  2.5646659 -0.70456041 -0.34550366  1.2701227
## 
## $frac1
## [1] 0.1
## 
## $frac2
## [1] 0.5
## 
## attr(,"class")
## [1] "geweke.results"


7.5.5 일관성 검정(consistency test)

일관성 검정을 위해 랜덤효과모형과 비일관성모형의 rainbow plot과 DiC를 비교하여 일관성을 측정한다.

  model_ran_inconsis <- BUGSnet::nma.model(data=rate2.slr,
                         outcome="diabetes",
                         N="n",
                         reference="Diuretic",
                         family="binomial",
                         link="cloglog",
                         time="followup",
                         type="inconsistency",
                         effects="random")
mcmc_ran_inconsis <- BUGSnet::nma.run(model_ran_inconsis,
                    n.burnin=1000,
                    n.iter=10000,
                    n.chains=4,
                    thin=10)
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 48
##    Unobserved stochastic nodes: 64
##    Total graph size: 1069
## 
## Initializing model
par(mfrow=c(1,2))
model_fit_ran <- BUGSnet::nma.fit(mcmc_ran, main="Consistency Random Effects Model")
model_fit_ran_inconsis <- BUGSnet::nma.fit(mcmc_ran_inconsis, main="Inconsistency Random Effects Model")

두 모형을 비교하면 consistency 모형의 DIC가 조금 더 낮게 나오지만 inconsistency 모형의 outlier가 leverage plot에 조금 더 가까이 나타나는 것으로 보인다. Dres는 inconsistency가 조금 더 낮게 나타나지만 모형의 복잡성(complexity)에 더 높은 비용을 지불하기 때문에 이러한 경우에 consistency 모형이 좀 더 적합한 것으로 간주된다.

par(mfrow=c(1,1))
BUGSnet::nma.compare(model_fit_ran, model_fit_ran_inconsis)

대부분의 점들이 라인 근처에 형성되어 있기때문에 두 모형은 비슷한 것으로 보인다. 이러한 경우에는 좀 더 일관성이 있는 모형을 선호한다.


7.5.6 Forest plot

Placebo를 기준으로 forest plot을 그려보면 다음과 같다. 이때 rma.forest 함수를 이용한다.

  BUGSnet::nma.forest(mcmc_ran,
             central.tdcy="median",
             comparator="Placebo",
             log.scale=FALSE)


7.5.7 치료 간 비교우위 선정(treatment randing)

각 치료에 대한 순위는 SUCRA plot을 통해 살펴본다. SUCRA plot을 위한 기본 정보는 nma.rank 함수를 이용하고, 결과물중 우선 rankogram을 이용해 ranking probability를 살펴보자.

sucra.out <- BUGSnet::nma.rank(mcmc_ran, largerbetter=FALSE, sucra.palette="Set1")
sucra.out$rankogram

이를 수치적으로 표현하면 다음과 같다.

sucra.out$ranktable
## # A tibble: 6 x 7
## # Groups:   rank [6]
##    rank `ACE inhibitor`   ARB blocker   CCB Diuretic Placebo
##   <dbl>           <dbl> <dbl>   <dbl> <dbl>    <dbl>   <dbl>
## 1     1           21.1  78.2     0     0.07     0       0.62
## 2     2           71.6  19.4     0.03  1.93     0       7   
## 3     3            6.68  2.1     0.03 26.6      0      64.6 
## 4     4            0.6   0.25    1.43 70.4      0.32   27.0 
## 5     5            0     0.03   78.4   1       19.8     0.73
## 6     6            0     0      20.1   0.05    79.8     0

Survace under the cumulative ranking curve (SUCRA)는 결과물중 sucraplot에 담겨 있다.

sucra.out$sucraplot

SUCRA plot의 수치적 정보는 다음과 같이 추출한다.

sucra.out$sucratable
## # A tibble: 7 x 7
##   rank  `ACE inhibitor` ARB   blocker CCB    Diuretic Placebo
##   <chr> <chr>           <chr> <chr>   <chr>  <chr>    <chr>  
## 1 1     21.12           78.17 0       0.07   0        0.62   
## 2 2     92.72           97.62 0.03    2      0        7.62   
## 3 3     99.4            99.72 0.06    28.58  0        72.24  
## 4 4     100             99.97 1.49    98.96  0.32     99.26  
## 5 5     100             100   79.89   99.96  20.17    99.99  
## 6 6     100             100   100.01  100.01 100      99.99  
## 7 SUCRA 82.65           95.1  16.29   45.91  4.1      55.95

네트워크 메타분석의 결과를 요약하는 또 다른 방법은 League table을 산출하는 것이다. League table은 모든 중재간의 상대 효과크기와 95% 신용구간을 포함한다.

league.out <- BUGSnet::nma.league(mcmc_ran,
                         central.tdcy="median",
                         order=sucra.out$order,
                         log.scale=FALSE,
                         low.colour="springgreen4",
                         mid.colour="white",
                         high.colour="red",
                         digits=2)

league.out$heatplot

여기서 hazard ratio의 원 scale을 유지하기 위해 log.scale=FALSE 옵션을 사용한다. 녹색은 treatment가 더 좋은 효과를 의미하고 (추정값이 1보다 작은), 반대로 빨간색은 효과가 나쁨을 의미한다. **는 신용구간이 1을 포함하지 않음을 의미하기 때문에 통계적으로 유의한 차이를 의미한다. 이 결과를 테이블로 추출하면 다음과 같다.

league.out$table
##               ARB                   ACE inhibitor         Placebo              
## ARB           "ARB"                 "1.08 (0.88 to 1.33)" "1.21 (1.00 to 1.46)"
## ACE inhibitor "0.93 (0.75 to 1.14)" "ACE inhibitor"       "1.12 (0.97 to 1.29)"
## Placebo       "0.83 (0.69 to 1.00)" "0.89 (0.78 to 1.04)" "Placebo"            
## CCB           "0.79 (0.64 to 0.94)" "0.85 (0.72 to 0.99)" "0.95 (0.80 to 1.12)"
## blocker       "0.67 (0.55 to 0.80)" "0.72 (0.61 to 0.84)" "0.81 (0.67 to 0.95)"
## Diuretic      "0.62 (0.49 to 0.77)" "0.67 (0.56 to 0.79)" "0.75 (0.62 to 0.89)"
##               CCB                   blocker               Diuretic             
## ARB           "1.26 (1.06 to 1.55)" "1.49 (1.25 to 1.83)" "1.60 (1.30 to 2.03)"
## ACE inhibitor "1.17 (1.01 to 1.38)" "1.38 (1.19 to 1.63)" "1.49 (1.26 to 1.78)"
## Placebo       "1.05 (0.89 to 1.25)" "1.24 (1.06 to 1.48)" "1.33 (1.13 to 1.61)"
## CCB           "CCB"                 "1.18 (1.04 to 1.34)" "1.27 (1.07 to 1.50)"
## blocker       "0.85 (0.75 to 0.96)" "blocker"             "1.08 (0.90 to 1.28)"
## Diuretic      "0.79 (0.67 to 0.93)" "0.93 (0.78 to 1.11)" "Diuretic"